字符串去重需分保持顺序与不保持顺序两种:保持顺序用for...of配合Set记录首次出现字符;不保持顺序可用[...new Set(str)];频次统计推荐Map,再按次数降序、字典序升序排序输出。

JavaScript中字符串去重和字符频率统计,核心在于遍历字符并用数据结构记录状态:去重要保留唯一性,频次统计要累计计数。
字符串去重(保持顺序)
关键点是“首次出现才保留”,不能简单用 Set 转数组再 join,否则会打乱原始顺序。推荐用 for...of 配合 Set 记录已见字符:
- 初始化空 Set 和空字符串 result
- 逐个遍历原字符串的每个字符 char
- 若 Set 中没有 char,就添加进 Set 并拼接到 result
- 返回 result
示例:"abacbd" → "abcd"
字符串去重(不保持顺序,仅留唯一字符)
如果只关心字符集合,不要求原始位置,可直接用 Array.from(new Set(str)) 或 [...new Set(str)],再 join 即可。简洁高效,但结果按插入顺序(即首次出现顺序),实际仍保持逻辑顺序,只是不反映原串中所有位置信息。
立即学习“Java免费学习笔记(深入)”;
字符频率统计
本质是构建“字符 → 出现次数”的映射,Object 或 Map 都适用。推荐用 Map,避免原型污染和类型隐式转换问题:
- 创建空 Map freq
- 遍历字符串每个字符 char
- 若 freq.has(char),则 freq.set(char, freq.get(char) + 1);否则 freq.set(char, 1)
- 最终 freq 就是完整频次表
也可用 reduce 简写:[...str].reduce((acc, c) => (acc[c] = (acc[c] || 0) + 1, acc), {})
组合使用:去重+频次+排序输出
常见需求如“按出现次数降序,次数相同时按字典序升序,列出各字符及频次”。步骤为:
- 先统计频次(得 Map 或对象)
- 转成数组(如 Array.from(freq.entries()))
- 用 sort 比较:(a, b) => b[1] - a[1] || a[0].localeCompare(b[0])
- map 格式化输出,如 `${char}:${count}`
例如 "aabbccabc" 输出可能是 ["a:3", "b:3", "c:3"](取决于排序细节)










