javascript字符串数组去重首选set,因其samevaluezero算法能精准处理含特殊字符的字符串;需语义去重时先标准化再过滤;避免用对象键或json.stringify以防出错。

JavaScript 中去重包含特殊字符的字符串数组,核心是用能正确比较字符串的方案,而不是依赖默认的 ===(它本身就能准确比较含特殊字符的字符串)。真正要注意的是:避免因误用对象键、正则、大小写或空白处理等引入错误;同时兼顾性能和可读性。
直接用 Set 最简单可靠
Set 是最推荐的方式——它基于 SameValueZero 算法,对任意字符串(包括空格、换行符、emoji、Unicode 符号、控制字符等)都能精确判等,不作任何隐式转换:
- ✅ 支持所有合法字符串,如
"a b"、"?"、"u200B"(零宽空格)、" x " - ✅ 保留原始顺序
- ✅ 代码简洁:
[...new Set(arr)]
示例:
const arr = ["hello", "world", "hello", "?", "?", "a b", "a b"];const unique = [...new Set(arr)]; // ["hello", "world", "?", "a b"]
需要忽略首尾空格或大小写?先标准化再 Set
如果“去重逻辑”本身要求语义一致(比如 " Hello " 和 "hello" 视为重复),那就不能直接用原字符串 Set,而要先映射成统一格式:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 忽略首尾空格:
arr.map(s => s.trim()) - 忽略大小写:
arr.map(s => s.toLowerCase()) - 两者都忽略:
arr.map(s => s.trim().toLowerCase()) - 再用
Set去重,并通过Map或find恢复原始值(如需)
示例(保留首次出现的原始字符串):
const arr = [" Hello ", "HELLO", "world", "WORLD"];const seen = new Set();
const unique = arr.filter(s => {
const key = s.trim().toLowerCase();
if (seen.has(key)) return false;
seen.add(key);
return true;
}); // [" Hello ", "world"]
避免用对象键或 JSON.stringify 做去重
以下方式看似可行,但容易出错:
- ❌
Object.fromEntries(arr.map(x => [x, 1])):若字符串含"__proto__"、"constructor"等属性名,可能被当作原型方法覆盖 - ❌
arr.reduce((o, s) => ({...o, [s]: 1}), {}):同上,且性能差、丢失顺序 - ❌ 对字符串先
JSON.stringify再去重:会把" "变成"\n",导致本应相同的字符串被判为不同
处理含 NaN 或 undefined 的混合数组?单独判断
如果数组里混了非字符串类型(如 NaN、undefined),而你只希望对字符串去重,建议先过滤再处理:
const strings = mixed.filter(item => typeof item === "string");
const uniqueStrings = [...new Set(strings)]; // ["a", "b", "c"]
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










