我上面使用的集合只对基本体有用。
set.add({"language": "ecmascript"});
两次向集合中添加两个不相等的对象(都具有相同的特性名称和值)。
如果你加上
相同的
对象多次,不会再次添加:
const set = new Set();
const obj = {"language": "ecmascript"};
set.add(obj);
set.add(obj);
console.log(set.size); // 1
Javascript是否有一个内置类型用于。。。
如果您希望具有相同属性和值的对象被视为相等的对象,则不需要。您需要能够指定比较操作,并且没有内置的
Set
显然,你可以创造一个。作为起点,我可能会使用
Map
由对象上属性的名称键入,排序并通过
JSON.stringify
. (不过,如果您想将符号键作为相等定义的一部分,这将不起作用。)例如,如果您只考虑自己的属性:
const key = JSON.stringify(Object.getOwnPropertyNames(object).sort());
一个条目的值可以是一个对象的数组,其中的键可以是线性搜索的对象,也可以是第二个
地图
由某种类型的属性值散列设置键,这取决于需要处理多少对象。。。
在评论中,我问:
您是否只需要处理具有JSON可序列化值的对象?
我有一堆已经序列化的对象,但有重复的,我想消除,然后重新序列化。
套
如果要跳过重新序列化部分:
const unique = new Map();
for (const source of serializedObjects) {
const sourceObject = JSON.parse(source); // Or parse from whatever serialization it is
// Build object adding properties in alpha order for stability
const keyObj = {};
for (const key of Object.keys(sourceObject).sort()) {
keyObj[key] = sourceObject[key];
}
// Save it using JSON.stringify, which uses ES2015 property order
map.set(JSON.stringify(keyObj), source);
}
const uniqueSourceStrings = [...map.values()];
const unique = new Map();
for (const source of serializedObjects) {
const sourceObject = JSON.parse(source); // Or parse from whatever serialization it is
// Build object adding properties in alpha order for stability
const keyObj = {};
for (const key of Object.keys(sourceObject).sort()) {
keyObj[key] = sourceObject[key];
}
// Save it using JSON.stringify, which uses ES2015 property order
map.set(JSON.stringify(keyObj), sourceObject); // <=================== changed
}
const uniqueSourceObject = [...map.values()];
// ^^================================================================== changed