如何用Lodash的countBy/reduce生成按频次排序的元素统计数组
使用Lodash实现按元素频次排序的哈希表数组
方法一:countBy + orderBy + map组合实现
这是最简洁的实现方式,步骤清晰直观:
- 用
_.countBy统计数组元素的出现频次:
const arr = ['A', 'B', 'C', 'B', 'A', 'B', 'C', 'B', 'B']; const countObj = _.countBy(arr); // 输出结果:{ A: 2, B: 5, C: 2 }
- 将统计对象转为键值对数组,方便后续排序操作:
const entries = _.entries(countObj); // 输出结果:[ ['A', 2], ['B', 5], ['C', 2] ]
- 按频次降序排序(若频次相同,可额外按元素名称排序,这里只做频次排序):
const sortedEntries = _.orderBy(entries, [1], ['desc']); // 输出结果:[ ['B', 5], ['A', 2], ['C', 2] ]
- 将排序后的键值对转为单个键值对的对象数组:
const result = _.map(sortedEntries, ([key, count]) => ({ [key]: count })); // 输出结果:[ { B: 5 }, { A: 2 }, { C: 2 } ]
也可以把步骤合并成链式调用,更简洁:
const arr = ['A', 'B', 'C', 'B', 'A', 'B', 'C', 'B', 'B']; const result = _.chain(arr) .countBy() .entries() .orderBy(1, 'desc') .map(([k, v]) => ({ [k]: v })) .value();
方法二:用reduce手动统计+排序
如果想手动通过reduce完成频次统计,后续步骤和方法一一致:
- 用
_.reduce统计元素频次:
const countObj = _.reduce(arr, (acc, curr) => { acc[curr] = (acc[curr] || 0) + 1; return acc; }, {}); // 输出结果和countBy一致:{ A: 2, B: 5, C: 2 }
- 重复方法一中的排序、转换步骤,即可得到目标结果。
内容的提问来源于stack exchange,提问作者user824624
相关产品推荐
相关产品推荐

