簡體   English   中英

如何使用 javascript 組合類似的 JSON 鍵

[英]How to combine similar JSON keys using javascript

想知道如何將類似的 json 鍵組合在一起以消除冗余數據。 換句話說,如何連接相同鍵下相似的值而不是重復數據? 我目前的 json 數據如下所示:

[
    {
        "listing_id": 1,
        "furniture_id": 2,
        "price": 129.99,
        "duration": null,
        "photo_id": 1,
        "url": "http://d3otkl9byfilk1.cloudfront.net/images/COHG3---A_Graceland-Silver-With-Malva-Blue-Grey-Contrast"
    },
    {
        "listing_id": 1,
        "furniture_id": 2,
        "price": 129.99,
        "duration": null,
        "photo_id": 2,
        "url": "https://www.responsive-checkout.com/demo/media/catalog/product/cache/1/image/9df78eab33525d08d6e5fb8d27136e95/c/o/couch.jpg"
    }
]

如何組合冗余鍵使其看起來像這樣:

[
    {
        "listing_id": 1,
        "furniture_id": 2,
        "price": 129.99,
        "duration": null,
        "photo_id": 1,
        "url": [{"http://d3otkl9byfilk1.cloudfront.net/images/COHG3---A_Graceland-Silver-With-Malva-Blue-Grey-Contrast", "https://www.responsive-checkout.com/demo/media/catalog/product/cache/1/image/9df78eab33525d08d6e5fb8d27136e95/c/o/couch.jpg"}]
    }
]

使用減少

作為您提供的第一個數組的initial

[initial.reduce(function (obj) { return obj })];

這基本上將數組內爆為它的第一個元素,然后將其放入一個數組中,如果您有具有不同值的對象,它就不夠智能。 如果那是您需要的,請更具體

如果您想推斷是否應該僅在某些屬性的值相同時將兩個對象合並到第一個對象中,這就是您要查找的內容:

var result = [];

initial.reduce(function (previous, current, index) { 
    if (index === 0) {
        result.push(current);
        return current;
    }
    if (current.prop1 !== previous.prop1
            || current.prop2 !== previous.prop2
            || current.prop3 ...) {
        result.push(current);
    }

    return current;
});

再說一次,如果相似的對象不相鄰,那將不起作用。 你真的需要更具體

好吧,這很有趣。 我花了一段時間,但這是一個可能的解決方案。 我敢肯定有更好的方法可以做到這一點,但這是有效的。

使用Array.prototype.filterArray.prototype.findIndex (ES6):

 const listings = [{ // sample listings with multiple listing_id and duplicates "listing_id": 1, "furniture_id": 2, "price": 129.99, "duration": null, "photo_id": 1, "url": "http://d3otkl9byfilk1.cloudfront.net/images/COHG3---A_Graceland-Silver-With-Malva-Blue-Grey-Contrast" }, { "listing_id": 1, "furniture_id": 2, "price": 129.99, "duration": null, "photo_id": 2, "url": "https://www.responsive-checkout.com/demo/media/catalog/product/cache/1/image/9df78eab33525d08d6e5fb8d27136e95/c/o/couch.jpg" }, { "listing_id": 1, "furniture_id": 2, "price": 129.99, "duration": null, "photo_id": 2, "url": "https://example.com" }, { "listing_id": 2, "furniture_id": 2, "price": 129.99, "duration": null, "photo_id": 2, "url": "https://www.responsive-checkout.com/demo/media/catalog/product/cache/1/image/9df78eab33525d08d6e5fb8d27136e95/c/o/couch.jpg" }, { "listing_id": 2, "furniture_id": 2, "price": 129.99, "duration": null, "photo_id": 2, "url": "https://example2.com" }, { "listing_id": 3, "furniture_id": 2, "price": 129.99, "duration": null, "photo_id": 2, "url": "https://example3.com" }]; const duplicates = []; const filteredListings = listings.filter((listing, index, self) => { // filter out all duplicates const found = self.findIndex(i => i.listing_id === listing.listing_id); if (found !== index) { duplicates.push(listing); // add duplicates to duplicate array to be added back in later. return false; } else return true; }); duplicates.forEach((duplicate) => { // loop through duplicates to add url back into main array const listIndex = filteredListings.findIndex(listing => listing.listing_id === duplicate.listing_id); if (Array.isArray(filteredListings[listIndex].url)) { filteredListings[listIndex].url.push(duplicate.url); } else filteredListings[listIndex].url = [filteredListings[listIndex].url, duplicate.url]; }); document.body.innerHTML = '<pre>' + JSON.stringify(filteredListings, 0, 4) + '</pre>';

暫無
暫無

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

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