You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 01:35:19