簡體   English   中英

javascript從對象數組中提取鍵的相同值

[英]javascript extract same values of keys from array of 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)

試試吧

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM