Somme objet javascript propertyA valeurs avec le même objet propertyB dans le tableau d'objets
Comment pourrait-on prendre un tableau javascript d'objets tels que:
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}]
et de fusion des doubles de clés en additionnant les valeurs.
Afin d'obtenir quelque chose comme ceci:
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}]
J'ai essayé de retravailler et d'ajouter un nouveau tableau, mais cela n'a pas fonctionné:
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
- Pourquoi faites-vous
key = Object.keys(item)[0]; item=item[key];
? Vous connaissez déjà le nom estkey
, il suffit donc de neitem.key
ouobjArr[i].key
. Aussi, à l'aide de la[0]
index ne sera pas nécessairement toujours de vous donner la même propriété.
Vous devez vous connecter pour publier un commentaire.
Vous devriez être en attribuant à chaque objet n'est pas trouvé le résultat avec ses
.key
propriété.S'il est trouvé, alors vous devez ajouter son
.val
.Aussi, une partie du problème est que vous avez été la réutilisation de la
item
variable de référence à la valeur de.key
, donc vous avez perdu la référence à l'objet.Plutôt que d'utiliser une boucle for et en poussant des valeurs, vous pouvez utiliser directement carte et réduire:
JS:
Vous pouvez utiliser une table de hachage pour le regroupement par
key
.JS:
CSS:
Une autre approche consiste à recueillir toutes les paires clé/valeur dans un
Map
et le format du tableau final avecArray.à partir de
et un rappel pour les objets.JS:
CSS:
val
dansthis[o.key].val += o.val;
avec votre propriété à ajouter.groups = ['foo', 'bar']
, à l'intérieur de laforEach
utilisationvar key = groups.map(k => o[k]).join('|');
et ensuite utiliserthis[key]
au lieu dethis[o.key]
. peut-être omettrethis
à tous et à utiliser une variable globale pour l'objet pour le regroupement.obj = [ { menu: "apple", amount: 3}, { menu: "apple", amount: 1}, {menu: "melon", amount: 10}, {menu: "stawberry", amount: 7} ];
je veux que la sortie est[ {menu: apple, total: 4}, {menu: melon, total: 10}, and.......... ]
@NinaScholzmenu
propriétés et mise à jouramount
.val
vsvalue
, merci!http://jsfiddle.net/HUMxp/
val
consolidés.Essayez cela, il doit aider à
Ci-dessous est une autre solution qui n'utilise qu'une seule boucle (boucle while):
Voici une alternative pour vous, mais similaire à celle de Explosion Pilules, réutilise le tableau d'origine plutôt que d'en créer une nouvelle ou un autre objet. Le tri peut ne pas être nécessaire et permettra de ralentir les choses un peu, mais il pourrait être retiré.
Javascript
jsFiddle
Et un jsperf qui permet de les comparer (avec et sans le tri) à l'encontre de la accepté de répondre. Vous pouvez améliorer les performances de test par l'extension de l'ensemble de données.
vous pouvez également essayer d'utiliser javascript linq cadre qui est exactement le même que l'instruction sql qui est donnée de sortie souhaités avec moins de code écrit et efficace et a trouvé linq.js
JS:
HTML:
qui est assez facile que de les comparer à une boucle.
j'espère que cela peut aider.
Récemment l besoin d'une semblable mise en œuvre et l a utilisé une solution similaire offert par un mec qui a utilisé la fonction de réduction. Quelques jours plus tard, j'ai voulu mettre en place quelque chose de similaire par moi-même et voilà le résultat.
De sortie: