Skip to content

统计字符数

这类题的核心是:遍历字符串时,为每个字符建立计数表。

最直接的写法

js
function countChars(str) {
  const result = {}

  for (const char of str) {
    if (result[char]) {
      result[char] += 1
    } else {
      result[char] = 1
    }
  }

  return result
}

console.log(countChars('abcabcabc')) // { a: 3, b: 3, c: 3 }

这类写法的优点是:

  • 可读性最好
  • 最容易扩展规则
  • 适合后续加过滤条件

也可以用 reduce

js
function countChars(str) {
  return [...str].reduce((result, char) => {
    result[char] = (result[char] || 0) + 1
    return result
  }, {})
}

这更偏函数式写法,但核心思路没有变,仍然是在累计计数对象。

如果要统计更复杂的内容

常见变体包括:

  • 忽略空格
  • 忽略大小写
  • 只统计字母或数字

例如忽略大小写:

js
function countChars(str) {
  const result = {}

  for (const char of str.toLowerCase()) {
    result[char] = (result[char] || 0) + 1
  }

  return result
}

一个容易忽略的点

如果字符串里包含表情、部分 Unicode 字符,for...of 通常比按下标遍历更稳妥:

js
for (const char of str) {
  console.log(char)
}

因为它是按字符迭代,而不是简单按 UTF-16 编码单元切。

使用建议

  • 普通场景优先用 for...of + 对象计数。
  • 需要链式表达时,可以改成 reduce
  • 如果题目带过滤条件,先把“统计什么、不统计什么”说清楚再实现。

基于 MIT 许可发布