我有数百个对象彼此内部 每个对象下面都有一个重复的对象结构,其中一个对象包含数百个相同的键,并且大多数键中的值也相同。
我想做的是从这个重复的对象中获取键和值,前提是它在所有对象中都相同,并将其放在一个包含所有相同的重复键/值对的新对象中,同时还将其从每个对象内部的重复对象中删除。
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"
}]
最佳答案
我们可以将第一个对象作为键值对的起点:
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)
关于javascript从对象数组中提取相同的键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46715864/