JavaScript混合数组去重需明确目标:严格去重(true/1/false/0全保留)推荐用Set;若需语义去重(true与1等价),则映射为统一key如"t"/"f"再过滤;避免用对象键,因类型转换不可控。

JavaScript 中去重包含布尔值和数字的混合数组,关键在于区分 true/false 与 1/0 的类型和值——它们在松散比较(==)下相等,但严格意义上是不同类型的独立值。直接用 Set 或 filter() 默认行为会出错,因为 Set 是基于严格相等(===)的,而 true === 1 为 false,所以默认 Set 其实能保留两者;但若你**希望逻辑上去重“语义等价”的值**(比如把 true 和 1 当作重复),就需要自定义规则。
明确去重目标:按类型+值严格去重(推荐默认方式)
这是最安全、最符合 JavaScript 本意的做法:不隐式转换,true、1、"1" 全部视为不同元素。
-
new Set([true, 1, false, 0])→Set(4) {true, 1, false, 0} - 代码简洁可靠:✅ 推荐用于大多数场景
按“抽象相等”去重(即 == 规则合并 true/1、false/0)
如果你业务要求 true 和 1 只留一个(比如表单提交后统一归一化),需手动映射到唯一键:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 对每个元素生成标准化 key:数字
0→"f",1→"t";布尔false→"f",true→"t";其余值(如2、"hello")保持原样或转字符串 - 示例实现:
const arr = [true, 1, false, 0, 2, "1"]; const seen = new Set(); const unique = arr.filter(item => { const key = item === 0 ? "f" : item === 1 ? "t" : item === false ? "f" : item === true ? "t" : String(item); if (seen.has(key)) return false; seen.add(key); return true; }); // → [true, false, 2, "1"](true 优先保留,1 被跳过;也可改用 item 本身作值)
用 Object 键自动转换的陷阱(不推荐)
有人尝试 Object.keys({true:1, 1:1}) 得到 ["1"],是因为对象键会把所有非 symbol 值转成字符串,且 true.toString() === "true",1.toString() === "1" —— 它们并不相同!真正冲突的是:1 和 "1" 都变成键 "1",但 true 变成 "true",不会和 1 冲突。所以靠对象去重既不可控又易误解,❌ 避免使用。
立即学习“Java免费学习笔记(深入)”;
补充:处理 NaN 和 -0 的细节
如果数组还含 NaN 或 -0,注意:Set 中 NaN 只算一个(ES6 特性),但 -0 === +0 为 true,所以它们会被视为同一值。若需区分 -0 和 +0,得用 Object.is(-0, +0) 判断,再定制逻辑。

















