我有以下数组:
var objArray = [
{ num: 1, date: '1/12/2017' },
{ num: 3, date: '1/12/2017' },
{ num: 7, date: '1/12/2017' },
{ num: 1, date: '1/13/2018' },
{ num: 3, date: '1/16/2018' },
{ num: 4, date: '1/16/2018' }
];
我想将具有相同日期的那些组合起来,以便输出数组如下所示:
var outputArr = [
{ num: 11, date: '1/12/2017' },
{ num: 1, date: '1/13/2018' },
{ num: 7, date: '1/16/2018' }
];
我将添加具有相似日期的所有 num
并创建一个新对象。
我有一个非常大的对象数据集,所以我正在努力减少处理时间。
我已将数组按日期排序,以便它反射(reflect) objArray
。
For 循环看起来很麻烦,因为我使用数组中的第一个日期并检查数组中的每个其他元素,如下面的伪代码:
var newArr = [];
for(i = 0; i < objArray.length; i++) {
for(j = 0; j < objArray.length; j++) {
var tempArr = [];
// check every date manually
// add similar to new array
tempArr.push({ similar items });
}
newArr.push(tempArr):
}
// Do another couple loops to combine those like arrays into another array
必须有一种比运行多个 for 循环更优雅的方式来执行此操作。
如有任何建议,我们将不胜感激。
最佳答案
只需使用 Array.reduce()
创建 map 并按日期对值进行分组, map 上的 Object.values()
将为您提供所需的输出值:
let arr = [ { num: 1, date: '1/12/2017' }, { num: 3, date: '1/12/2017' }, { num: 7, date: '1/12/2017' }, { num: 1, date: '1/13/2018' }, { num: 3, date: '1/16/2018' }, { num: 4, date: '1/16/2018' } ];
let result = Object.values(arr.reduce((a, {num, date})=>{
if(!a[date])
a[date] = Object.assign({},{num, date});
else
a[date].num += num;
return a;
},{}));
console.log(result);
关于javascript - 在 JavaScript 数组中按日期组合类似对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51936130/