javascript从对象数组

时间:2017-10-12 17:45:11

标签: javascript arrays json javascript-objects

我有数百个对象在彼此里面 在每个对象下面都有一个重复的对象结构,其中包含一百个相同的键,在大多数键中,值也是相同的。

我想要做的是从这个重复的对象中获取密钥和值,只有在整个对象中它们相同并将其放在一个包含所有相同重复键/值对的新对象中时同时将其从每个对象内部的重复对象中删除。

json对象例如:

[{
    "name": "A",
    "values": {
        "ab": "abc",
        "ac": "1",
        "ad": "none"
    },
    "childs": []
},
{
    "name": "A",
    "values": {
        "ab": "abc",
        "ac": "1",
        "ad": "none"
    },
    "childs": [{
        "name": "B",
        "values": {
            "ab": "abc",
            "ac": "1",
            "ad": "none"
        },
        "childs": [{
                "name": "C",
                "values": {
                    "ab": "abc",
                    "ac": "1",
                    "ad": "none"
                },
                "childs": []
            },
            {
                "name": "C",
                "values": {
                    "ab": "def",
                    "ac": "1",
                    "ad": "none"
                },
                "childs": []
            }
        ]
    }]
},
{
    "name": "A",
    "values": {
        "ab": "abc",
        "ac": "1",
        "ad": "none"
    },
    "childs": [{
        "name": "D",
        "values": {
            "ab": "abc",
            "ac": "1",
            "ad": "none"
        },
        "childs": []
    }]
}]

期望的输出:

[{
    "name": "A",
    "values": {
        "ab": "abc"
    },
    "childs": []
},
{
    "name": "A",
    "values": {
        "ab": "abc"
    },
    "childs": [{
        "name": "B",
        "values": {
            "ab": "abc"
        },
        "childs": [{
                "name": "C",
                "values": {
                    "ab": "abc"
                },
                "childs": []
            },
            {
                "name": "C",
                "values": {
                    "ab": "def"
                },
                "childs": []
            }
        ]
    }]
},
{
    "name": "A",
    "values": {
        "ab": "abc"
    },
    "childs": [{
        "name": "D",
        "values": {
            "ab": "abc"
        },
        "childs": []
    }]
}]

并且新对象包含已删除的键/值对,因为它们是相同的:

[{
    "ac": "1",
    "ad": "none"
}]

1 个答案:

答案 0 :(得分:1)

我们可以将第一个对象作为键值对的起点:

let pairs = Object.entries( objects[0].values );

然后对于所有值,我们删除非欺骗:

function remove(obj){
  pairs = pairs.filter(([key,value]) => obj.values[key] === value);
  //the same for all childs:
  if(obj.childs) obj.childs.forEach(remove);
}
objects.forEach(remove);

所以现在我们得到了每个对象共享的键值列表,所以现在我们可以再次构建一个对象:

const result = {};
for(let [key,value] of pairs) result[key] = value;

我们可以删除重复项:

function dupes(obj){
  pairs.forEach(([key]) => {
    if( key in obj.values) delete obj.values[key];
  });
  if(obj.childs) obj.childs.forEach(dupes);
}
objects.forEach(dupes)

Try it