计算数组中每个值的出现

时间:2018-07-23 10:00:36

标签: javascript arrays reduce

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

2 个答案:

答案 0 :(得分:1)

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)

答案 1 :(得分:0)

遍历数组,将特定属性存储在对象中,添加新对象或增加数组中的数字。

您似乎想编写简短的代码,但我选择了使该函数更具动态性的自由。

var result = function(arr, firstProperty, secondProperty) {
  var reducedArr = [];
  var tempObj = {};
  var currentArrIndex = 0;
  var firstPropertyValue = '';

  secondProperty = secondProperty || 'frequency';

  for (var i = 0; i < arr.length; i++) {
    firstPropertyValue = arr[i][firstProperty];

    if (firstPropertyValue) {
      if (tempObj.hasOwnProperty(firstPropertyValue)) {
        currentArrIndex = tempObj[firstPropertyValue];
        reducedArr[currentArrIndex][secondProperty] += 1;
      } else {
        currentArrIndex = reducedArr.length
        tempObj[firstPropertyValue] = currentArrIndex;

        reducedArr[currentArrIndex] = {};
        reducedArr[currentArrIndex][firstProperty] = arr[i][firstProperty];
        reducedArr[currentArrIndex][secondProperty] = 1;
      }
    }
  }

  return reducedArr;
}

// EXAMPLES
// result(arrays, 'name')
// result(arrays, 'id')
// result(arrays, 'id, 'occurrancies')