javascript - 按键求和 Javascript 对象数组

标签 javascript arrays object sum

我查看了堆栈溢出,感觉有一个更简单的解决方案,使用map和reduce来解决这个问题,但这是迄今为止我解决它的笨拙方法。我需要按日期汇总数据,而原始 json 对象中没有“键”。请参阅下面的代码片段和似乎有效的结果。我将不胜感激任何关于做得更好的意见。 谢谢。

// 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);

最佳答案

正如 @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这是我的第一个答案。

关于javascript - 按键求和 Javascript 对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56977102/

相关文章:

java - 重写 HashCode,什么时候这样做不会有问题?

c++ - SMFL - 仅绘制了 2 个对象中的 1 个

javascript - 使用 javascript 从 shoutcast 流中获取 IDv3 标签

javascript - 通过 Google 标签管理器 Ajax POST XMLHttpRequest 到 DataLayer

javascript - 在window.onload之前执行耗时的任务

javascript - VueJS 数据()不工作

c++ - 如何在文件中写入动态分配的 2D 'array'?

javascript - 在功能上创建一个位置数组(使用 Underscore/Lodash)

java - 了解 AsyncTask 与 Web 服务器访问

javascript - 在运行时确定的对象类型 - Javascript (ExtJS)