我搜索了stackoverflow的答案,但我真的没有看到任何解决这个问题的方法。我想取一个数组中的对象,按名称匹配它们。然后计算匹配对象小时值的总和。
如果这是数组
var arr = [{name: 'Apple', hours: 6}, {name: 'Nokia', hours: 8},
{name: 'Apple', hours: 4}, {name: 'Nokia', hours: 12},];
//return [{name: 'Apple', totalHrs: '10'}], [{name: 'Nokia', totalHrs:
'24'}]
感谢您的帮助。
答案 0 :(得分:2)
这是不可能的,对象文字不能有两个相同的键。相反,您可以将值相加并将名称作为键
let arr = [{name: 'Apple',hours: 6}, {name: 'Nokia',hours: 8},{name: 'Apple',hours: 4}, {name: 'Nokia',hours: 12}];
let obj = arr.reduce((a, b) => {
a[b.name]= (a[b.name] || 0) + b.hours;
return a;
}, {});
console.log(obj);
答案 1 :(得分:2)
使用一些散列 和for循环
var hash={}; // hash array to contain names and total hours
var arr = [{name: 'Apple', hours: 6}, {name: 'Nokia', hours: 8},
{name: 'Apple', hours: 4}, {name: 'Nokia', hours: 12},];
for(var i=0; i<arr.length; i++)
{
if(arr[i].name in hash)
hash[arr[i].name]+=arr[i].hours;
else
hash[arr[i].name]=arr[i].hours;
}
console.log(hash);`
答案 2 :(得分:1)
你可以这样做:
function findItemsByProp(array, propName, value) {
var results = [];
for (var i = 0; i < array.length; i++) {
if (array[i][propName] == value)
results.push(array[i]);
}
return results;
}
这是如何使用它:
var matching = findItemsByProp(myArray, 'name', 'someValueOfNameProp');
var total = 0;
for(var i = 0; i < matching.length; i++)
total += matching[i].hours;
console.log(total);
当然你可以在迭代数组的同时做总和,但这是一种在其他地方使用的通用方法。