为什么用Set存对象时无法去重?

UX保霞 阅读 55

我在用Set存储用户对象时发现,即使两个对象的属性完全相同,Set还是会把它们当作不同元素。比如:


const set = new Set();
const obj1 = { id: 1, name: 'Alice' };
const obj2 = { id: 1, name: 'Alice' };
set.add(obj1);
set.add(obj2);
console.log(set.size); // 输出2,但期望是1

我试过把对象转成字符串再存,但感觉这样很笨拙。有没有更好的办法让Set根据对象内容判断重复?

我来解答 赞 8 收藏
二维码
手机扫码查看
2 条解答
ლ红彦
ლ红彦 Lv1
Set判断重复靠的是引用地址,不是内容。想按内容去重,用Map存序列化后的key就行了。

const map = new Map();
const obj1 = { id: 1, name: 'Alice' };
const obj2 = { id: 1, name: 'Alice' };
map.set(JSON.stringify(obj1), obj1);
map.set(JSON.stringify(obj2), obj2);
console.log(map.size); // 输出1


或者自己实现个内容比较函数也行,但序列化更省事。
点赞 2
2026-02-16 12:08
迷人的新霞
因为对象引用不同,Set没法自动判断内容重复。我一般直接用JSON.stringify转成字符串存:

const set = new Set();
const obj1 = { id: 1, name: 'Alice' };
const obj2 = { id: 1, name: 'Alice' };
set.add(JSON.stringify(obj1));
set.add(JSON.stringify(obj2));
console.log(set.size); // 输出1
点赞 6
2026-02-06 10:15