2017-02-04 4 views
-3

Ich habe ein Array von Objekten:Wie fasst man alle Objekte in einem Objekt-Array zusammen?

var test = [{"a":1, "b":2, "c":3}, {"a":4, "b":5, "c":6},{"a":7, "b":8, "c":9}]; 

Ich möchte alle Werte im Objekt b aufzuaddieren aus einem Array von Werten um einen einzelnen Wert zu erhalten, die insgesamt 15

+0

Was meinst du mit _object b_? Objekt.b? oder das zweite Objekt? –

Antwort

0

Das Verfahren, um wieder Array#reduce ist, Sie geben ihm eine Akkumulator-Funktion und einen optionalen Startwert und es gilt sie für jedes Element, bis er den Endwert bekommt:

var test = [{"a":1, "b":2, "c":3}, {"a":4, "b":5, "c":6},{"a":7, "b":8, "c":9}]; 

test 
    .map(function pluckB(o) { return o.b }) // Take only the 'b' property 
    // => [2,5,8] 
    .reduce(function add(a, b) { return a + b }, 0); // Sum them, starting from 0 
    // => 15 

es kann mit ES2015 noch knapperer bekommen arrow functions:

test.map(o => o.b).reduce((a, b) => a + b, 0) 

Und mit einer funktionalen Nutzen Bibliothek wie Ramda, es ist nur ein Aufruf von zwei Funktionen:

R.sum(R.pluck('b', test)) 

Als @ibrahim mahrir kann bei in den Kommentaren andeuten wollte, in JavaScript es kann leistungsfähiger sein, um tatsächlich zu komponieren solche Operationen zusammen und nur durch das Array einmal durchlaufen anstelle von einem Pipeline-Stil. Das liegt daran, .map, .filter und co. Erstellen Sie neue Array-Kopien, anstatt das Array an Ort und Stelle zu ändern, und diese Instanziierung hat ihre Kosten.
Wenn dieser Code jedoch nicht in einer sehr engen Schleife läuft, ist die Auswirkung auf die Leistung im Vergleich zur erhöhten Wartbarkeit der Verwendung der lesbarsten Lösung absolut vernachlässigbar.

+0

Warum 'map' verwenden? Einfach summieren, ohne 'map' zu verwenden! –

+0

Es scheint mir klarer zu sein, die zwei Operationen des Extrahierens der Werte von den Objekten zu trennen und * dann * sie zusammenzufügen. – lleaff

+0

Es verwendet mehr Ressourcen ohne Grund. –

0

Verwenden reduce stattdessen wie folgt aus:

var test = [{"a":1, "b":2, "c":3}, {"a":4, "b":5, "c":6},{"a":7, "b":8, "c":9}]; 
 

 

 
var sum = test.reduce((s, o) => s + o.b, 0); 
 

 
console.log(sum);

Hinweis: Dieses test.reduce((s, o) => s + o.b, 0) verwendet eine Pfeil Funktion. Es ist das gleiche wie:

test.reduce(function(s, o) { 
    return s + o.b; 
}, 0); 
0

Wenn Sie die Summe jedes Objekt im Array finden wollen, durchlaufen das Array das aktuelle Element mit der Summe der Werte überschrieben werden.

var test = [{"a":1, "b":2, "c":3}, {"a":4, "b":5, "c":6},{"a":7, "b":8, "c":9}]; 
 

 
test.forEach((e, i, a) => a[i] = Object.values(e).reduce((x, y) => x + y, 0)); 
 

 
console.log(test)

Wenn Sie die Summe der Werte der Anpassungseigenschaften jedes Objekt im Array finden wollen, durchlaufen das Array ein neues Objekt zu erstellen und die Werte basierend auf dem Schlüssel hinzuzufügen.

var test = [{"a":1, "b":2, "c":3}, {"a":4, "b":5, "c":6},{"a":7, "b":8, "c":9}]; 
 

 
var result = test.reduce((o, e) => { 
 
    for(var i in e) 
 
    o[i] = (o[i] || 0) + e[i]; 
 
    return o; 
 
}, {}); 
 

 
console.log(result);

Sie werden bemerken, dass die Werte des zweiten Objekts gleich 15, sowie alle Werte der Eigenschaften „b“ genannt, so ist es nicht ganz klar ist, was Sie sind nach hier.

Verwandte Themen