使用reduce计算数组中每个元素的出现次数

时间:2019-05-06 14:45:53

标签: javascript

使用reduce计数数组中每个元素的出现次数。 我的代码是错误的!

我的代码:

function countOccurrences(arr) {
  return arr.reduce(function(a, b){
    var count = 0;
    for(var i = 0; i < arr.length; i++){
      if (arr[i] == b) {
        return count + 1;
      }
    }
  }, '');
}

console.log(countOccurrences(['a', 'b', 'c', 'b', 'a']));

期望:

// { 
//   a: 2, 
//   b: 2, 
//   c: 1 
// }

非常感谢!

3 个答案:

答案 0 :(得分:2)

您犯了两个错误:

  • 通过将a作为第二个参数,您将''的初始值转换为空字符串。
  • 您无需在reduce()内再次循环。 reduce()遍历所有元素。

function countOccurrences(arr) {
  return arr.reduce(function(a, b){
    a[b] = a[b] + 1 || 1
    return a;
  }, {});
}
console.log(countOccurrences(['a', 'b', 'c', 'b', 'a']));

使用“箭头功能”的班轮将是

const count = (arr) => arr.reduce((ac,a) => (ac[a] = ac[a] + 1 || 1,ac),{})

console.log(count(['a', 'b', 'c', 'b', 'a']));

答案 1 :(得分:0)

您可以使用reduce遍历数组并将其汇总为一个对象。将累加器初始化为对象{}。检查每个字母是否作为累加器中的属性存在。如果不是,则启动为0,然后加1。

function countOccurrences(arr) {
  return arr.reduce((a, b) => (a[b] = (a[b] || 0) + 1, a), {});
}

let result = countOccurrences(['a', 'b', 'c', 'b', 'a']);
console.log(result);

答案 2 :(得分:0)

在reduce中,将空对象用作初始累加器。在此对象中检查是否存在相关密钥。如果是这样,则增加计数,否则创建密钥并为其分配值

function countOccurrences(arr) {

  return arr.reduce(function(acc, curr) {
    if (acc[curr]) {
      acc[curr] += 1;
    } else {
      acc[curr] = 1
    }
    return acc;

  }, {})

}

console.log(countOccurrences(['a', 'b', 'c', 'b', 'a']));