Summe javascript-Objekt propertyA-Werte mit dem gleichen Objekt propertyB in array von Objekten
Wie sollte man ein javascript-array von Objekten, wie:
my objArr = [
{key:Mon Sep 23 2013 00:00:00 GMT-0400, val:42},
{key:Mon Sep 24 2013 00:00:00 GMT-0400, val:78},
{key:Mon Sep 25 2013 00:00:00 GMT-0400, val:23},
{key:Mon Sep 23 2013 00:00:00 GMT-0400, val:54}]
- und merge-doppelt vorhandene Schlüssel durch die Summe der Werte.
Um so etwas wie dieses:
my reducedObjArr = [
{key:Mon Sep 23 2013 00:00:00 GMT-0400, val:96},
{key:Mon Sep 24 2013 00:00:00 GMT-0400, val:78},
{key:Mon Sep 25 2013 00:00:00 GMT-0400, val:23}]
Habe ich versucht Durchlaufen und hinzufügen, um ein neues array, aber das hat nicht funktioniert:
var reducedObjArr = [];
var item = null, key = null;
for(var i=0; i<objArr.length; i++) {
item=objArr[i];
key = Object.keys(item)[0];
item=item[key];
if(!result[key]){
result[key] = item;
}else{
result[key] += item;}
}a
- Warum machst du
key = Object.keys(item)[0]; item=item[key];
? Sie kennen bereits den Namen istkey
, so einfach tunitem.key
oderobjArr[i].key
. Auch mit der[0]
index nicht unbedingt immer die gleiche Eigenschaft.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie zuweisen jedes Objekt wurde nicht gefunden, um das Ergebnis mit seinen
.key
Eigenschaft.Wenn es gefunden wird, dann müssen Sie die
.val
.Auch ein Teil des Problems war, dass Sie die Wiederverwendung der
item
variable reference den Wert.key
, so dass Sie verloren Verweis auf das Objekt.Statt mit einer for-Schleife und PUSH die Werte, die Sie direkt verwenden können anzeigen und reduzieren:
JS:
Könnte man eine hash-Tabelle für die Gruppierung von
key
.JS:
CSS:
Ein anderer Ansatz ist es, sammeln Sie alle Schlüssel/Wert-Paaren in einer
Map
und formatieren Sie die Letzte Reihe mitArray.aus
und ein callback für die Objekte.JS:
CSS:
val
imthis[o.key].val += o.val;
mit Ihrer Immobilie hinzufügen.groups = ['foo', 'bar']
innerhalb derforEach
verwendenvar key = groups.map(k => o[k]).join('|');
und verwenden Sie dannthis[key]
stattthis[o.key]
. vielleicht auslassenthis
an alle und eine Globale variable verwenden, für die das Objekt für die Gruppierung.obj = [ { menu: "apple", amount: 3}, { menu: "apple", amount: 1}, {menu: "melon", amount: 10}, {menu: "stawberry", amount: 7} ];
ich möchte die Ausgabe ist[ {menu: apple, total: 4}, {menu: melon, total: 10}, and.......... ]
@NinaScholzmenu
Eigenschaften und updateamount
.val
vsvalue
, danke!http://jsfiddle.net/HUMxp/
val
konsolidiert.Versuchen, diese, sollte es helfen,
Unten ist eine weitere Lösung, die verwendet nur eine Schleife (while-Schleife):
Hier eine alternative für Sie, aber ähnlich wie Explosion Pillen, verwendet das original-array, anstatt ein neues zu erstellen oder ein anderes Objekt. Die Art kann nicht notwendig sein, und wird die Dinge verlangsamen ein wenig, aber es könnte entfernt werden.
Javascript
jsFiddle
Und ein jsperf, vergleicht diese (mit und ohne Sortieren) gegen die akzeptierte Antwort. Sie können zur Verbesserung der performance-test durch die Erweiterung des Datensatzes.
können Sie auch versuchen, javascript-linq-framework, das ist genau das gleiche wie sql-Anweisung, die gewünschten output mit weniger code geschrieben und effektiv gefunden bei linq.js
JS:
HTML:
das ist ziemlich einfach, da im Vergleich zu Loopen.
ich hoffe, dies kann helfen.
Kürzlich l benötigt eine ähnliche Implementierung und l verwendet eine ähnliche Lösung angeboten, die von einem Kerl, der verwendet, reduzieren Funktion. Paar Tage später wollte ich implementieren etwas ähnliches von mir und hier ist das Ergebnis.
Ausgabe: