簡體   English   中英

javascript將對象數組的數組求和

[英]javascript sum array of arrays of objects together

我有以下格式的數組

[
[{year:2015, value:23000, value1:1000},{year:2016,value:1000, value1:2000},{year:2017,value:400, value1:3000}],
[{year:2015, value:10000, value1:1000},{year:2016,value:2000, value1:3000},{year:2017,value:500, value1:2000}],
]

我想將它們加在一起,在這個例子中,我想

[{year:2015,value:33000, value1:2000},{year:2016,value:3000, value1:5000},{year:2017,value:900, value1:5000}]

如果陣列中只有兩個陣列,但較大的陣列中可能有更多的陣列。 我怎樣才能做到這一點? 目前,我無法找到一個好的方法。 謝謝

Ecmascript5解決方案:

 var arr = [ [{year:2015, value:23000, value1:1000},{year:2016,value:1000, value1:2000},{year:2017,value:400, value1:3000}], [{year:2015, value:10000, value1:1000},{year:2016,value:2000, value1:3000},{year:2017,value:500, value1:2000}] ], // summing up values for each `year` years = arr.reduce(function (r, a) { a.forEach(function (o) { y = o.year; if (Array.isArray(r[y])) { r[y][0] += o.value; r[y][1] += o.value1; } else { r[y] = [o.value, o.value1]; } }); return r; }, {}), // constructing the resulting array containing objects with `year` totals result = Object.keys(years).map(function (y) { return {year: y, value: years[y][0], value1: years[y][1]}; }); console.log(result); 

您可以在地圖/對象上循環顯示項目並為年份值(鍵)添加值。

var data = [
[{year:2015, value:23000},{year:2016,value:1000},{year:2017,value:400}],
[{year:2015, value:10000},{year:2016,value:2000},{year:2017,value:500}],
];

var output = {};

data.forEach(function(item) {
  item.forEach(function(obj) {
    output[obj.year] = (output[obj.year] || 0) + obj.value;
  });
});
output = [output]

console.log(output);

一種方法是先將2D陣列平坦。

var output = {};
var flatArray = data.reduce(function(a, b) {
  return a.concat(b);
}, []);

flatArray.forEach(function(obj) {
  output[obj.year] = (output[obj.year] || 0) + obj.value;
});

output = [output]
console.log(output);

輸出:[{2015:33000,2016:3000,2017:900}]

您可以使用哈希表收集一年數據,並使用嵌套方法遍歷數組,並迭代給定對象的所有屬性。

然后創建新屬性並添加實際值。

它可以處理任意數量的屬性。

 var data = [[{ year: 2015, value: 23000, value1: 1000 }, { year: 2016, value: 1000, value1: 2000 }, { year: 2017, value: 400, value1: 3000 }], [{ year: 2015, value: 10000, value1: 1000 }, { year: 2016, value: 2000, value1: 3000 }, { year: 2017, value: 500, value1: 2000 }]], result = data.reduce(function (hash) { return function (r, a) { a.forEach(function (o) { if (!hash[o.year]) { hash[o.year] = { year: o.year }; r.push(hash[o.year]); } Object.keys(o).forEach(function (k) { if (k !== 'year') { hash[o.year][k] = (hash[o.year][k] || 0) + o[k]; } }); }); return r; }; }(Object.create(null)), []); console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

這是一個可行的解決方案。 這將滿足您的需求。 希望能幫助到你!

 var arr = [ [{year:2015, value:23000, value1:1000},{year:2016,value:1000, value1:2000},{year:2017,value:400, value1:3000}], [{year:2015, value:10000, value1:1000},{year:2016,value:2000, value1:3000},{year:2017,value:500, value1:2000}], ] var result = []; for(var i = 0; i < arr[0].length; i++){ var count = 0 var count2 = 0; for(var j = 0; j < arr.length; j++){ var year = arr[j][i].year; count += arr[j][i].value; count2 += arr[j][i].value1; } result.push({ year: year, value: count, value1: count2 }); } console.log(result); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM