我看过堆栈溢出,感觉有一个更简单的解决方案,使用map和reduce来解决这个问题,但到目前为止,这是我笨拙的解决方法。我需要按日期汇总数据,而不需要在原始json对象中使用"key“。请看下面的代码片段和结果,这似乎是可行的。我将非常感谢任何关于做得更好的意见。谢谢。
// input
var array1 = [{'2019-07-13': 1, '2019-07-14': 4, '2019-07-15': 7}];
var array2 = [{'2019-07-13': 5, '2019-07-14': 8, '2019-07-15': 6}];
var array3 = [{'2019-07-13': 2, '2019-07-14': 1, '2019-07-15': 9}];
// output should look like this
// [{2019-07-13: 8, 2019-07-14: 13, 2019-07-15: 22}]
var combinedArray = [];
var finalArraySum = [];
// combine all the arrays into one...
var arrays = array1.concat(array2, array3);
arrays.forEach((array, index) => {
Object.keys(array).forEach(function(key) {
var element = [key, array[key]];
combinedArray.push(element);
})
});
// loop through the combined arrays
combinedArray.forEach((item, index) => {
// figure out if the item already exists in the final summed up array
var sumExists = finalArraySum.filter((innerItem, index) => {
return innerItem[0] === item[0];
});
// if not exists, then push the initial one
if(sumExists.length === 0) {
finalArraySum.push([item[0], item[1]]);
} else {
// else add up to the already existing one
sumExists[0][1] = item[1] + sumExists[0][1];
}
})
console.log(finalArraySum);
var finalObject = [];
var stringObject = '{';
finalArraySum.forEach((item, index) => {
console.log(item);
stringObject = stringObject + '"' + item[0] + '":"' + item[1] + '",';
});
stringObject = stringObject.substr(0, stringObject.length - 1) + "}";
console.log(JSON.parse(stringObject));
finalObject.push(JSON.parse(stringObject));
console.log(finalObject);
发布于 2019-07-11 03:14:42
正如@HereticMonkey指出的那样,这个问题可能更适合Code Review社区,因为StackOverflow通常用于获得解决特定问题的帮助,而不是讨论函数代码的质量。请记住这一点,以便下一次使用。
这就是说,是的,可以在这里使用Array#reduce
,但这不是最简单的方法。两个循环和一些解构就足够了。
var array1 = [{'2019-07-13': 1, '2019-07-14': 4, '2019-07-15': 7}];
var array2 = [{'2019-07-13': 5, '2019-07-14': 8, '2019-07-15': 6}];
var array3 = [{'2019-07-13': 2, '2019-07-14': 1, '2019-07-15': 9}];
let mergedInput = [...array1, ...array2, ...array3];
let temp = {};
for (a of mergedInput) {
for (const [k, v] of Object.entries(a)) {
temp[k] = (temp[k]||0)+a[k];
}
}
console.log(temp);
如果您仍然对了解Array#reduce
实现感兴趣,请在revision history中查找我的第一个答案。
发布于 2019-07-11 03:24:04
您可以使用Array.prototype.reduce
来实现这一点-
const concat = (a = {}, b = {}) =>
Object
.entries(b)
.reduce
( (r, [ k, v ]) =>
({ ...r, [k]: (r[k] || 0) + v })
, a
)
const main = (...all) =>
all.reduce(concat, {})
var array1 =
[{'2019-07-13': 1, '2019-07-14': 4, '2019-07-15': 7}]
var array2 =
[{'2019-07-13': 5, '2019-07-14': 8, '2019-07-15': 6}]
var array3 =
[{'2019-07-13': 2, '2019-07-14': 1, '2019-07-15': 9}]
console.log(main(...array1, ...array2, ...array3))
// { '2019-07-13': 8
// , '2019-07-14': 13
// , '2019-07-15': 22
// }
发布于 2019-07-11 03:39:41
您可以将所有对象合并到单个数组中,并按如下方式减少该数组:
const array1 = [{'2019-07-13': 1, '2019-07-14': 4, '2019-07-15': 7}];
const array2 = [{'2019-07-13': 5, '2019-07-14': 8, '2019-07-15': 6}];
const array3 = [{'2019-07-13': 2, '2019-07-14': 1, '2019-07-15': 9}];
const all = [...array1, ...array2, ...array3];
const sumtotal = Object.keys(array1[0]).reduce((acc, key) => {
return { ...acc, [key]: all.reduce((acc, arr) => acc + arr[key], 0) };
}, {});
console.log(sumtotal);
https://stackoverflow.com/questions/56977102
复制相似问题