javascript利用对象或map键的唯一性去重:对象适合原始值但存在类型隐式转换问题(如1与"1"冲突),map支持任意类型键且精确区分(如1、"1"、nan),更健壮;set为标准方案,简洁高效。

JavaScript 中利用临时对象属性名检查去重,本质是借助对象(或 Map)的键唯一性来过滤重复项。这种方法适合处理简单类型(如字符串、数字)数组,速度快、代码简洁。
用普通对象做哈希表去重
对象的属性名会自动转为字符串,所以只适用于原始值且不关心类型细节的场景(比如 1 和 "1" 会被视为相同):
const arr = [1, 2, 2, 3, "3", 4, 1];
const unique = [];
const seen = {};
for (const item of arr) {
if (!seen[item]) {
seen[item] = true;
unique.push(item);
}
}
// unique → [1, 2, 3, "3", 4]
- 利用
item作为属性名,天然去重 - 注意:
undefined、null、[object Object]等会隐式转换,可能引发意外覆盖 - 推荐配合
typeof或严格判断优化,但会牺牲简洁性
用 Map 保证类型和值精确区分
Map 允许任意类型作键,能正确区分 1 和 "1"、NaN(Map 中 NaN 是唯一键),更健壮:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const arr = [1, "1", NaN, NaN, {}, {}];
const map = new Map();
const unique = [];
for (const item of arr) {
if (!map.has(item)) {
map.set(item, true);
unique.push(item);
}
}
// unique → [1, "1", NaN, {}, {}]
-
Map.has()比obj[prop] !== undefined更准确,避免原型链干扰 - 对引用类型(如对象、数组),仍是按内存地址判断,同内容不同实例仍算“不重复”
- 若需深比较去重,需额外序列化或自定义逻辑,不属于属性名检查范畴
一行写法(ES6+):结合 Set 或 reduce
虽然不是“临时对象”,但语义接近且常用,可作为补充方案:
// 利用 Set 自动去重(最简,但不保持原始顺序?→ 实际上保持插入顺序)
const unique = [...new Set(arr)];
// 或用 reduce + 对象(模拟临时哈希)
const unique2 = arr.reduce((acc, item) => {
if (!acc.seen[item]) {
acc.seen[item] = true;
acc.result.push(item);
}
return acc;
}, { seen: {}, result: [] }).result;
-
Set是标准去重方案,底层也依赖键唯一性,性能好、语义清 -
reduce版本显式维护临时对象,逻辑透明,适合需要中间控制的场景 - 避免在循环中反复创建新对象,影响性能
注意事项与边界情况
临时对象属性名检查看似简单,但几个坑容易忽略:
-
对象/数组作为键会调用
toString()→{}→"[object Object]",多个空对象冲突 -
布尔值、数字、字符串混用时类型隐式转换 →
true、1、"1"在对象中可能碰撞,Map 则不会 -
特殊值如
NaN:对象中obj[NaN] = 1实际等价于obj["NaN"] = 1,无法识别;Map 支持真正的NaN键 - 频繁操作大数组时,优先选
Map或Set,它们专为查找优化,比普通对象更可靠
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










