我有一个包含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}]

最佳答案

findIndexreduce一起使用

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)

10-02 00:52
查看更多