代码之家  ›  专栏  ›  技术社区  ›  Lonnie Best

对象和数组的Javascript集

  •  1
  • Lonnie Best  · 技术社区  · 5 年前

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

    我上面使用的集合只对基本体有用。

    1 回复  |  直到 5 年前
        1
  •  2
  •   Lonnie Best    5 年前

    我上面使用的集合只对基本体有用。

    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