如何在JavaScript中更简洁地将一维数组转换为频率字典?
简洁实现JavaScript数组元素频率统计
你想要实现类似Python Counter的功能:将一维数组转换为以元素为键、出现次数为值的频率字典,并按出现次数降序排序。
参考的Python实现:
import random from collections import Counter sorted(Counter(random.randbytes(1024)).items(), key=lambda x: -x[1])
你当前的JavaScript实现:
var numbers = Array.from({length: 1024}, () => Math.floor(Math.random() * 256)) var counter = Object() for (let number of numbers) { if (counter.hasOwnProperty(number)) {counter[number] += 1} else {counter[number] = 1} } Object.entries(counter).sort(([,a],[,b]) => b-a)
以下是几种更简洁的实现方案:
方案1:用Array.reduce()简化计数逻辑
利用reduce把循环逻辑压缩,自动处理键不存在的情况:
const numbers = Array.from({length: 1024}, () => Math.floor(Math.random() * 256)); const sortedCounts = Object.entries( numbers.reduce((acc, num) => { acc[num] = (acc[num] || 0) + 1; return acc; }, {}) ).sort(([,a], [,b]) => b - a);
(acc[num] || 0)会在键未定义时默认取0,省去了hasOwnProperty的判断步骤。
方案2:使用Map保留数字键类型
如果需要保留元素的数字类型键(对象的键会被强制转为字符串),可以用Map实现:
const numbers = Array.from({length: 1024}, () => Math.floor(Math.random() * 256)); const countMap = numbers.reduce((map, num) => { map.set(num, (map.get(num) || 0) + 1); return map; }, new Map()); // 转为和原实现格式一致的排序数组 const sortedCounts = [...countMap.entries()].sort(([,a], [,b]) => b - a);
方案3:极致简洁的一行式(兼顾可读性)
借助逗号运算符进一步压缩代码,把生成数组、统计、排序合并:
const sortedCounts = Object.entries( Array.from({length: 1024}, () => Math.floor(Math.random() * 256)) .reduce((acc, num) => (acc[num] = (acc[num] || 0) + 1, acc), {}) ).sort(([,a], [,b]) => b - a);
内容的提问来源于stack exchange,提问作者Ξένη Γήινος
相关产品推荐
相关产品推荐

