Valeur de somme d'objet Javascript basée sur les propriétés effitivement

J'ai trois objets dans un tableau dans JS comme ci-dessous

[{"2013-03-02T00:00": 300}, {"2013-03-01T00:00": 200},{"2013-03-02T00:00": 50}] 

Je veux quelque chose comme ci-dessous comme sortie du tableau ci-dessus.

 [{"2013-03-02T00:00": 350} , {"2013-03-01T00:00": 200}] 

Cela peut se faire en bouclant et en ajoutant, y at-il un moyen efficace de le faire?

Merci d'avance.

 var myList = [{"2013-03-02T00:00": 300}, {"2013-03-01T00:00": 200},{"2013-03-02T00:00": 50}]; var result = {}; var item = null, key = null; for(c=0; c<myList.length; c++) { item=myList[c]; key = Object.keys(item)[0]; item=item[key]; if(!result[key]) result[key] = item; else result[key] += item; } console.log(result); 

Je laisse comme un exercice pour le lecteur de mettre le résultat dans le formulaire demandé. (Après tout, vous devez résoudre au moins une partie de votre problème vous-même 🙂

Si vous pouvez ajouter la clé "date" comme autre valeur de l'objet que vous pouvez trier et regrouper, cela sera plus rapide et plus optimisé lorsque vous disposez de plus de valeurs dans le tableau.

[MISE À JOUR]: Correction d'un petit bogue.

 var arr = [{"date":"2013-03-02T00:00",val: 300} , {"date":"2013-03-01T00:00",val: 200} ,{"date":"2013-03-02T00:00",val: 50}]; function groupArray(arr){ if(arr.length===0){return [];} var pref,i; // sort by date arr.sort(function(a,b){ return (a.date>b.date)?1:(a.date<b.date)?-1:0; }); // loop through the array grouping objects by date pref=arr[0].date; for(i=1;i<arr.length;i++){ if(arr[i].date===pref){ //set the total arr[i-1].val=arr[i-1].val+arr[i].val; //remove the element arr.splice(i,1); // set i one back i--; } pref=arr[i].date; } return arr; } console.log(groupArray(arr)); 

Un exemple plus compliqué est lorsque vous souhaitez dynamiquement fournir la clé à trier, dans l'exemple ci-dessus, la clé est "codé dur" pour être date mais vous devez peut-être regrouper sur une autre valeur de clé, ce qui suit est un code I J'ai eu l'impression que j'ai simplifié pour regrouper par une clé (l'original a utilisé un ensemble de clés). Vous pouvez passer une variable onMerge qui devrait être une fonction qui permet de fusionner 2 éléments. Cette fonction n'est pas générique et est spécifique à l'ajout des propriétés val des objets fusionnés.

 var arr = [{"date":"2013-03-02T00:00",val: 300} , {"date":"2013-03-01T00:00",val: 200} , {"date":"2013-03-01T00:00",val: 200} , {"date":"2013-03-01T00:00",val: 200} , {"date":"2013-03-01T00:00",val: 200} ,{"date":"2013-03-02T00:00",val: 50}]; /** * @param arr is the array to be merged * @param key is the key to use for merge * (like date) will merge on items with same * date value * @param onMerge function to call when 2 items * are merged with the 2 items as parameters **/ function groupArray(arr,key,onMerge){ if(arr.length===0){return [];} var pref,i; // sort by key arr.sort(function(a,b){ return (a[key]>b[key])?1:(a[key]<b[key])?-1:0; }); // loop through the array grouping objects by key pref=arr[0][key]; for(i=1;i<arr.length;i++){ if(arr[i][key]===pref){ //merge 2 items, call the onMerge callback arr[i-1]=onMerge(arr[i-1],arr[i]); //remove the element arr.splice(i,1); // set i one back i--; } pref=arr[i][key]; } return arr; } // functon that will be called when 2 items are merged // stay will stay and gone will be gone // this function is specific to your data type function onMergeCallback(stay,gone){ stay.val=stay.val+gone.val; return stay; } console.log(groupArray(arr,"date",onMergeCallback)); 

Vous voudrez peut-être jeter un coup d'oeil à underscore.js , qui a des implémentations pour beaucoup de fonctions utiles et efficaces pour manipuler et traiter les données. Plus précisément, vous voudriez voir la fonction _.groupBy :

 var data = [{"2013-03-02T00:00": 300}, {"2013-03-01T00:00": 200},{"2013-03-02T00:00": 50}] _.groupBy(data, function(obj) { return Object.keys(obj)[0]; }) 

Vous devriez toujours itérer et résumer les valeurs, mais c'est pourquoi nous réduisons les fonctions!

Si vous voulez quelque chose de plus spécifique à votre cas d'utilisation, je voudrais regarder la source sur github.

https://github.com/documentcloud/underscore