Javascript是否有一个内置类型,用于生成由数据对象和数组组成的集合?
let set = new Set();
set.add({"language": "ecmascript"});
set.add({"language": "ecmascript"});
set.add({"language": "ecmascript"});
set.add({"language": "ecmascript"});
set.add([1,2,3]);
set.add([1,2,3]);
set.add([1,2,3]);
set.add([1,2,3]);
console.log(set);
我使用的集合只对原语有用。
发布于 2019-04-17 12:26:31
我使用的集合只对原语有用。
这是不正确的,它对对象很好。问题是具有相同属性和属性值的不同对象不相等,因此执行set.add({"language": "ecmascript"});
两次向集合添加两个不相等的对象(都具有相同的属性名称和值)。
如果您多次添加同一个对象,则不会再次添加该对象:
const set = new Set();
const obj = {"language": "ecmascript"};
set.add(obj);
set.add(obj);
console.log(set.size); // 1
Javascript有内置类型的.
如果希望将具有相同属性值和值的对象视为相等,则不。您需要能够指定比较操作,而且在JavaScript中没有内置的JavaScript允许您定义要使用的比较操作。
显然,你可以创建一个。作为起点,我可能会使用一个Map
键,该键由对象上的属性名称组成,并通过JSON.stringify
排序并转换为字符串。(不过,如果您希望将符号键作为平等定义的一部分,则这是行不通的。)例如,如果您只考虑自己的属性:
const key = JSON.stringify(Object.getOwnPropertyNames(object).sort());
条目的值可以是一个带有这些键的对象数组,您可以对其进行线性搜索,也可以是由属性值的某种哈希键组成的第二个Map
,这取决于您需要处理的对象有多少.
在评论中,我问:
您只需要处理具有JSON序列化值的对象吗?
你回答说:
我有一堆已经序列化的对象,但是有一些重复的对象,我想消除它们,然后重新序列化。
是的,如果您不介意重新序列化,可以使用Set
,如果您想跳过重新序列化部分,可以使用Map
:
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
https://stackoverflow.com/questions/55727435
复制相似问题