2016-08-08 44 views
1

Ich möchte das folgende Dataset-Array in ein anderes Format transformieren. Derzeit hat jedes Wörterbuch im Array einen 'count', 'fruit' und 'first name'. Ich möchte ein neues Wörterbuch für jeden eindeutigen Vornamen erstellen und Werte, die dieser Vorname für jeden 'Frucht' Typ hat.Wie gruppiere und transformiere Wörterbuch Array auf einem bestimmten Schlüssel-Attribut in ein anderes Format mit Javascript (funktionale Programmierung)?

Zum Beispiel siehe unten für einige Eingangsdaten

var input_data = [{"count":1,"fruit":"apple","first_name":"abe"},{"count":1,"fruit":"apple","first_name":"bob"},{"count":10,"fruit":"banana","first_name":"bob"},{"count":5,"fruit":"cherry","first_name":"abe"}] 

Wir wissen zu diesem Datensatz, der die Kategorien sind [ 'Apfel', 'Banane', 'Kirsche']

var desired_output = 
[{name: 'abe',data:[1,0,5]}, 
{name: 'bob',data:[1,10,0]}] 
+0

Haben Sie 'groupBy' versucht? – Bergi

+1

Ich sehe keine Beziehung zwischen input_data und Datenarrays in der gewünschten Ausgabe? – Ozan

+0

@Bergi - Wie benutzt du groupBy? Das könnte das sein, wonach ich suche. – Chris

Antwort

1

Sie könnte eine Hash-Tabelle für die Namensreferenz und ein Objekt für den rechten Index zum Zählen verwenden.

var input_data = [{"count":1,"fruit":"apple","first_name":"abe"},{"count":1,"fruit":"apple","first_name":"bob"},{"count":10,"fruit":"banana","first_name":"bob"},{"count":5,"fruit":"cherry","first_name":"abe"}], 
 
    categories = ['apple', 'banana', 'cherry'], 
 
    cat = {}, 
 
    result = []; 
 

 
categories.forEach(function (a, i) { cat[a] = i; }); 
 
input_data.forEach(function (a) { 
 
    if (!this[a.first_name]) { 
 
     this[a.first_name] = { name: a.first_name, data: categories.map(function() { return 0; }) }; 
 
     result.push(this[a.first_name]); 
 
    } 
 
    this[a.first_name].data[cat[a.fruit]] += a.count; 
 
}, Object.create(null)); 
 
console.log(result);

+0

Das einzige Problem hier ist, dass ich möchte, dass das Ergebnis widerspiegelt, dass Bob 10 Bananen hat und Abe 5 Kirschen hat. Zum Beispiel erzeugt das Ergebnis hier [{Name: 'abe', Daten: [1,0,1]}, {Name: 'Bob', Daten: [1,1,0]}], aber ich will es um zu generieren [{name: 'abe', data: [1,0,5]}, {name: 'bob', daten: [1,10,0]}] – Chris

+0

siehe edit. –