JavaScript数组元素重复计数异常求助:计数结果错误累加
问题分析与解决
你的代码出现计数错误的核心原因有两个:
- 未声明
count变量,会自动成为全局变量,存在污染风险 - 每次遍历
shortened中的元素时,没有将count重置为0,导致每次的计数都会累加之前的结果,最终输出错误
修正后的基础版本代码
let array = ['brown', 'apple', 'engine', 'engine', 'engine', 'brown', 'cell', 'Derek'] let shortened = [...new Set(array)].sort() for (let i = 0; i < shortened.length; i++) { // 每次循环开始时初始化count为0 let count = 0 array.forEach(element => { if (element === shortened[i]) { count++ } }) console.log(count) }
运行这段代码会输出你期望的:1, 2, 1, 1, 3
更高效的实现方式
上面的嵌套循环时间复杂度是O(n²),如果数组很大会影响性能,推荐用reduce方法一次性统计所有元素的出现次数,再遍历排序后的去重数组输出结果:
let array = ['brown', 'apple', 'engine', 'engine', 'engine', 'brown', 'cell', 'Derek'] // 用reduce统计每个元素的出现次数 const countMap = array.reduce((map, item) => { map[item] = (map[item] || 0) + 1 return map }, {}) // 对去重后的元素排序 let shortened = [...new Set(array)].sort() // 遍历输出每个元素的次数 shortened.forEach(item => { console.log(countMap[item]) })
这段代码的时间复杂度是O(n log n)(主要来自排序),比嵌套循环更高效。
内容的提问来源于stack exchange,提问作者user19846911
相关产品推荐
相关产品推荐

