我有数百个对象在彼此里面 在每个对象下面都有一个重复的对象结构,其中包含一百个相同的键,在大多数键中,值也是相同的。
我想要做的是从这个重复的对象中获取密钥和值,只有在整个对象中它们相同并将其放在一个包含所有相同重复键/值对的新对象中时同时将其从每个对象内部的重复对象中删除。
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"
}]
答案 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)