主题
统计字符数
这类题的核心是:遍历字符串时,为每个字符建立计数表。
最直接的写法
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。 - 如果题目带过滤条件,先把“统计什么、不统计什么”说清楚再实现。
