Skip to content

如何对JavaScript数组进行分组和计数?

在数组中找到每个值的计数在许多情况下都很有用。使用JavaScript的Array方法,无论是原始值还是复杂值,都可以相对简单地实现。

计算数组中每个值的出现次数

您可以使用Array.prototype.reduce()方法创建一个对象,其中数组的唯一值作为键,它们的频率作为值。使用空值合并运算符(??)来初始化每个键的值为0,如果不存在,则每次遇到相同的值时将其增加1

const frequencies = arr =>
  arr.reduce((a, v) => {
    a[v] = (a[v] ?? 0) + 1;
    return a;
  }, {});

frequencies(['a', 'b', 'a', 'c', 'a', 'a', 'b']);
// { a: 4, b: 2, c: 1 }
frequencies([...'ball']);
// { b: 1, a: 1, l: 2 }

根据函数对数组元素进行分组

您还可以根据给定的函数将数组元素分组,并返回每个组中元素的计数。当您想要根据特定属性或函数对元素进行分组时,这将非常有用。

为此,您可以使用Array.prototype.map()方法将数组的值映射到一个函数或属性名称,然后使用Array.prototype.reduce()方法创建一个对象,其中键是从映射结果产生的。

const countBy = (arr, fn) =>
  arr
    .map(typeof fn === 'function' ? fn : val => val[fn])
    .reduce((acc, val) => {
      acc[val] = (acc[val] || 0) + 1;
      return acc;
    }, {});

countBy([6.1, 4.2, 6.3], Math.floor);
// {4: 1, 6: 2}
countBy(['one', 'two', 'three'], 'length');
// {3: 2, 5: 1}
countBy([{ count: 5 }, { count: 10 }, { count: 5 }], x => x.count);
// {5: 2, 10: 1}