javascript - 对象和数组的 Javascript“设置”
问题描述
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);
我上面使用的 Set 仅对基元有用。
解决方案
我上面使用的 Set 仅对基元有用。
这是不正确的,它适用于对象。问题是具有相同属性和属性值的不同对象不相等,因此执行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
JavaScript 中没有内置功能可以让您定义要使用的比较操作。
显然,您可以创建一个。作为一个起点,我可能会使用Map
对象上的属性名称作为键,通过JSON.stringify
. (尽管如果您想将 Symbol 键作为相等定义的一部分,这将不起作用。)例如,如果您只考虑自己的属性:
const key = JSON.stringify(Object.getOwnPropertyNames(object).sort());
条目的值可以只是一个对象数组,其中包含您对其进行线性搜索的那些键,也可以是Map
由某种属性值的散列键控的第二个对象,具体取决于您需要处理的对象数量。 .
在评论中,我问:
您只需要处理具有 JSON 可序列化值的对象吗?
你回答:
我有一堆已经序列化的对象,但是我想删除一些重复项,然后重新序列化。
Set
是的,如果您不介意重新序列化,或者Map
如果您想跳过重新序列化部分,您可以使用 a :
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
推荐阅读
- ruby - 在模型中包含自定义模块后注释gem不起作用
- java - 使用 Coldfusion 访问 tyro 支付网关
- javascript - 如何在不重复整个对象的情况下返回几乎相似的对象
- angular - 斯巴达克斯从 1.4.4 升级到 3.2 后 SSR 不工作
- c - 用C程序杀死一个进程
- django - django 收音机选项无法显示
- apache-flink - kafka 连接器是否仅支持仅附加流
- python - 如何检查全局变量python
- javascript - 'PasswordCredential' 未定义 -> 创建 React 模板
- r - 任何人都可以请帮助r中的树状图标签吗?