我有一个包含ID和名称的对象数组。
var array = [ {'id':1, 'name': Bob}, {'id':1, 'name': Bob}, {'id':1, 'name': Bob}, {'id':2, 'name': Jeff}, {'id':1, 'name': Bob}, {'id':2, 'name': Jeff}, ]
使用
var result = array.reduce((ac, p) => ({
...ac, [p.product_name]: (ac[p.product_name] || 0) + 1
}),{})
我会得到
{Bob: 4, Jeff: 2}
我应该怎么做才能使函数返回
[{name: "Bob", frequency: 4}, {name: "Jeff", frequency: 2}]
最佳答案
将findIndex
与reduce
一起使用
findIndex将获取名称匹配的对象在数组中的索引。如果不是-1
,则不存在名称值与数组匹配的任何对象。如果存在,则更新频率键的值
var arrays = [{
'id': 1,
'name': 'Bob'
}, {
'id': 1,
'name': 'Bob'
}, {
'id': 1,
'name': 'Bob'
}, {
'id': 2,
'name': 'Jeff'
}, {
'id': 1,
'name': 'Bob'
}, {
'id': 2,
'name': 'Jeff'
}]
let newArray = arrays.reduce(function(acc, curr, index) {
let getIndex = acc.findIndex(function(item) {
return item.name === curr.name;
})
if (getIndex === -1) {
acc.push({
name: curr.name,
frequency: 1
})
} else {
acc[getIndex].frequency = acc[getIndex].frequency + 1
}
return acc;
}, [])
console.log(newArray)