按名称查找数组中的匹配对象,然后添加匹配对象的值

时间:2018-01-09 20:16:52

标签: javascript arrays

我搜索了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'}]

感谢您的帮助。

3 个答案:

答案 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);  

当然你可以在迭代数组的同时做总和,但这是一种在其他地方使用的通用方法。