js字符串数组去重首选set,保序高效;混入其他类型时用map精准限定字符串;需预处理或条件过滤用filter+indexof;函数式流程可用reduce。

直接用 Set 最省事
这是目前最主流、最推荐的做法,一行代码搞定,天然保持首次出现顺序,时间复杂度 O(n),底层哈希优化成熟。
-
写法:
const unique = [...new Set(arr)]或Array.from(new Set(arr)) -
注意:区分大小写和空格,
"abc"和"ABC"、"a "被视为不同字符串,如需忽略,先统一转小写或 trim 再去重
用 Map 避免隐式类型转换陷阱
当数组里混有数字、布尔值等其他基本类型(比如 ["1", 1, true]),而你只想对纯字符串去重时,Set 会把 "1" 和 1 当作两个值——这其实是正确行为,但有时会造成干扰。Map 可以帮你精准锁定字符串类型。
-
写法:
const map = new Map();<br>arr.filter(str => typeof str === 'string' && !map.has(str) && map.set(str, 1));
- 适用场景:接口返回数据类型不稳,需过滤非字符串再处理
用 filter + indexOf 精确控制逻辑
虽然性能略低于 Set(O(n²)),但逻辑透明、可读性强,适合需要加条件判断的场合,比如跳过空字符串或只保留长度大于 2 的字符串后再去重。
-
基础写法:
arr.filter((s, i) => arr.indexOf(s) === i) -
带预处理示例:
arr.map(s => s.trim()).filter(s => s.length > 0).filter((s, i, a) => a.indexOf(s) === i)
用 reduce 构建函数式链式流程
适合嵌入数据处理流水线中,比如从 API 响应里提取字段、清洗、去重一气呵成。
-
写法:
arr.reduce((acc, str) => {<br> if (!acc.includes(str)) acc.push(str);<br> return acc;<br>}, []) - 优势:不依赖外部变量,便于组合、测试和复用











