首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对象和数组的Javascript "Set“

对象和数组的Javascript "Set“
EN

Stack Overflow用户
提问于 2019-04-17 12:20:48
回答 1查看 156关注 0票数 1

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);

我使用的集合只对原语有用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-17 12:26:31

我使用的集合只对原语有用。

这是不正确的,它对对象很好。问题是具有相同属性和属性值的不同对象不相等,因此执行set.add({"language": "ecmascript"});两次向集合添加两个不相等的对象(都具有相同的属性名称和值)。

如果您多次添加同一个对象,则不会再次添加该对象:

代码语言:javascript
运行
复制
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排序并转换为字符串。(不过,如果您希望将符号键作为平等定义的一部分,则这是行不通的。)例如,如果您只考虑自己的属性:

代码语言:javascript
运行
复制
const key = JSON.stringify(Object.getOwnPropertyNames(object).sort());

条目的值可以是一个带有这些键的对象数组,您可以对其进行线性搜索,也可以是由属性值的某种哈希键组成的第二个Map,这取决于您需要处理的对象有多少.

在评论中,我问:

您只需要处理具有JSON序列化值的对象吗?

你回答说:

我有一堆已经序列化的对象,但是有一些重复的对象,我想消除它们,然后重新序列化。

是的,如果您不介意重新序列化,可以使用Set,如果您想跳过重新序列化部分,可以使用Map

代码语言:javascript
运行
复制
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()];

或者对于反序列化对象本身:

代码语言:javascript
运行
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55727435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档