如何对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}