2016-10-16 2 views
2

Wie würde eine Funktion aussehen, die ein Eingabeobjekt "tastet"? Ich habe das Thema recherchiert, konnte aber keine guten Antworten finden.Kann ich einem Objekt einen dynamischen Schlüssel hinzufügen?

Also, wenn ich ein Eingabeobjekt hat ...

var fruits = [{fruit: "apple", taste: "sour"}, 
       {fruit: "cherry", taste: "sweet", color: "red"}]; 


functionname(fruits, function(i) { return i.fruit; }); 

RETURN: 

    { "apple": [{fruit: "apple", taste: "sour"}], 
    { "cherry": [{fruit: "cherry", taste: "sweet", color: "red"}] 

functionname(fruits, function(i) { return i.taste.length; }); 

RETURN: 

    { "4": [{fruit: "apple", taste: "sour"}], 
    { "5": [{fruit: "cherry", taste: "sweet", color: "red"}] 
+0

Mein erster Gedanke w wie forEach, aber forEach ist Array.forEach (callback), also würde ich stattdessen '[] .forEach.call' sagen :) – Keith

Antwort

0

könnten Sie eine Funktion verwenden, die ein neues Objekt erstellt und die Elemente mit dem gesuchten Schlüssel zurück.

Version mit Array#forEach

function getKeyedArray(array, callback) { 
 
    var object = Object.create(null); 
 
    array.reduce(function (a) { 
 
     var key = callback(a); 
 
     object[key] = object[key] || []; 
 
     object[key].push(a); 
 
    }); 
 
    return object; 
 
} 
 

 
var fruits = [{ fruit: "apple", taste: "sour" }, { fruit: "cherry", taste: "sweet", color: "red" }]; 
 

 
console.log(getKeyedArray(fruits, function (i) { return i.fruit; })); 
 
console.log(getKeyedArray(fruits, function (i) { return i.taste.length; }));

Version mit Array#reduce

function getKeyedArray(array, callback) { 
 
    return array.reduce(function (r, a) { 
 
     var key = callback(a); 
 
     r[key] = r[key] || []; 
 
     r[key].push(a); 
 
     return r; 
 
    }, Object.create(null)); 
 
} 
 

 
var fruits = [{ fruit: "apple", taste: "sour" }, { fruit: "cherry", taste: "sweet", color: "red" }]; 
 

 
console.log(getKeyedArray(fruits, function (i) { return i.fruit; })); 
 
console.log(getKeyedArray(fruits, function (i) { return i.taste.length; }));

+1

Erstaunlich. Das funktioniert völlig! Vielen Dank. –

Verwandte Themen