我有一个对象数组,我想计算不同元素的数量和这些对象的数量。
[ { name: 'Suman',
game: '5A'
},
{ name: 'Suman',
game: '5A'
},
{ name: 'Namus',
game: '5A'
},
{ name: 'Namus',
game: '5A'
}
]
我想计算不同名称的数量并将它们存储在一个对象中。我试过1#推送数组中的所有名称, 2#然后排序他们, 3#然后计算不同名称的数量和 4#终于将它们推向了物体。 这个过程太长了。有没有更短的方法来做到这一点。我正在使用Nodejs
提前致谢
答案 0 :(得分:2)
您将创建一个新对象,其中键是名称,值是count:
var youArr = [
{ name: 'Suman',
game: '5A'
},
{ name: 'Suman',
game: '5A'
},
{ name: 'Namus',
game: '5A'
},
{ name: 'Namus',
game: '5A'
}
];
var count = {}
for(var i=0; i < youArr.length; i++){
count[youArr[i].name] = count[youArr[i].name] || 0;
count[youArr[i].name]++;
}
alert(count['Namus']); // 2
答案 1 :(得分:0)
这是使用reduce
function的好地方:
reduce()方法对累加器和每个都应用一个函数 数组的值(从左到右)必须将其减少为单个 值。
...
reduce对每个元素执行一次回调函数 数组,不包括数组中的空洞,接收四个参数: 初始值(或前一次回调调用的值),值 当前元素,当前索引和数组 迭代正在发生。
它看起来像这样:
var arr = [ { name: 'Suman',
game: '5A'
},
{ name: 'Suman',
game: '5A'
},
{ name: 'Namus',
game: '5A'
},
{ name: 'Namus',
game: '5A'
}
]
var counts = arr.reduce(function(counts, item) {
counts[item.name] = (counts[item.name] || 0) + 1;
return counts;
}, {});
然后 counts
:
{ Suman: 2, Namus: 2 }
在评论中提问:
如果我想要计数以及对象数组中的名称,该怎么办?
[{name: 'Suman', count:'2'}, {name:'Namus', count:'2'}]
如果您已经从上面的counts
来电中获得reduce
,那么您可以map
获得所需格式的密钥:
var countsArray = Object.keys(counts).map(function(name) {
return {name: name, count: counts[name]};
});
然后 countsArray
:
[ { name: 'Suman', count: 2 },
{ name: 'Namus', count: 2 } ]