我有一个包含许多具有匹配键的对象的数组:
[{a: 2, b: 5, c: 6}, {a:3, b: 4, d:1},{a: 1, d: 2}]
我想遍历数组,如果键匹配,我想添加每个键的结果,并返回一个具有每个键之和的对象。
即。
{a: 6, b: 9, c: 6, d: 3}
我目前的代码是
function combine() {
var answer = [];
for(var i in arguments){
answer.push(arguments[i])
}
answer.reduce(function(o) {
for (var p in o)
answer[p] = (p in answer ? answer[p] : 0) + o[p];
return answer;
}, {});
}
如果我要使用下划线库,我可以找到答案here但是我希望在不使用库的情况下这样做。我想我很难理解reduce
方法的工作原理 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
如何解决这个问题的任何帮助将不胜感激。此外,我觉得这是一个应该在某处的答案,而不必使用库。
提前致谢。
答案 0 :(得分:2)
使用Array.reduce()和Array.map()
var tab = [{a: 2, b: 5, c: 6}, {a:3, b: 4, d:1},{a: 1, d: 2}];
function sum(tab) {
return tab.reduce((a, b) => {
Object.keys(b).map(c => a[c] = (a[c] || 0) + b[c]);
return a;
});
}
console.log(sum(tab));
答案 1 :(得分:1)
遍历每个对象并添加它。
var a = [{a: 2, b: 5, c: 6}, {a:3, b: 4, d:1},{a: 1, d: 2}];
var ans = {};
for(var i = 0; i < a.length; ++i){
for(var obj in a[i]){
ans[obj] = ans[obj] ? ans[obj] + a[i][obj] : a[i][obj];
}
}
document.write(JSON.stringify(ans));
ans[obj] = ans[obj] ? ans[obj] + a[i][obj] : a[i][obj];
This line is the same as
// check if the object already exists(or not falsy) in answer, if Yes add that value to the new value
if(ans[obj])
{
ans[obj] = ans[obj] + a[i][obj];
}
// else create a new object in the answer and set it to the value from the array
else
{
ans[obj] = a[i][obj];
}
答案 2 :(得分:1)
试试这个
resobj = {};
[{a: 2,b: 5,c: 6}, {a: 3,b: 4,d: 1}, {a: 1,d: 2}].forEach(function(v) {
var keys = Object.keys(v);
for (i = 0; i < keys.length; i++) {
if (typeof resobj[keys[i]] == 'undefined') {
resobj[keys[i]] = Number(v[keys[i]]);
} else {
resobj[keys[i]] += v[keys[i]];
}
}
})
document.write(JSON.stringify(resobj))
答案 3 :(得分:1)
reduce()
中的回调函数需要两个参数:
您还应该传递一个空对象作为第二个参数来减少。这是你要填写的那个。
var input = [
{a: 2, b: 5, c: 6},
{a: 3, b: 4, d: 1},
{a: 1, d: 2}
];
var answer = input.reduce(function(prev, curr) {
for (var p in curr) {
prev[p] = (prev[p] || 0) + curr[p];
}
return prev; // this will be passed as prev in the next iteration or returned as the result.
}, {}); // The {} is the initial value passed as prev
console.log(answer);
&#13;
答案 4 :(得分:0)
还原的另一种解决方案:
var result = [{a: 2, b: 5, c: 6}, {a:3, b: 4, d:1},{a: 1, d: 2}].reduce(function(prev, current) {
Object.keys(current).forEach(function(key) {
prev[key] = (prev[key] || 0) + current[key];
});
return prev;
}, {});
document.write('<pre>' + JSON.stringify(result, 0, 2) + '</pre>');
答案 5 :(得分:0)
只需使用Array#forEach()
和结果对象。
var data = [{ a: 2, b: 5, c: 6 }, { a: 3, b: 4, d: 1 }, { a: 1, d: 2 }],
obj = {};
data.forEach(function (o) {
Object.keys(o).forEach(function (k) {
obj[k] = (obj[k] || 0) + o[k];
});
})
document.write('<pre>' + JSON.stringify(obj, 0, 4) + '</pre>');