javascript从对象数组中提取相同的键值

标签 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"
}]

最佳答案

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

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

关于javascript从对象数组中提取相同的键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46715864/

相关文章:

javascript - 如何使用html5生成临时公钥

javascript - Shopify API : Get url that leads directly to checkout

javascript - IE8中访问iframe Object.prototype

python ,OpenCV : Increasing image brightness without overflowing UINT8 array

php - array_a 是否包含 array_b 的所有元素

json - 是否可以对 ElasticSearch 文档中返回的字段进行排序

javascript - 在 Javascript 倒计时器中向分和秒添加前导零

c - c中数组和指针的区别?

json - 如何在 Druid 中格式化 TSV 文件

javascript - 使用 Jquery AJAX 获取 Java 对象作为 JSON 响应