【问题标题】:How to combine similar JSON keys using javascript如何使用 javascript 组合相似的 JSON 键
【发布时间】:2016-08-29 04:25:12
【问题描述】:

想知道如何将相似的 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"}]
    }
]

【问题讨论】:

  • 那么 photo_id 键呢?你想用它做什么?
  • 如果你想正确地做到这一点(有时你可能需要更深地合并),你应该使用lodash!查看我最后一个问题:stackoverflow.com/questions/36928983/…

标签: javascript json node.js


【解决方案1】:

使用reduce

成为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;
});

再一次,如果相似的对象不彼此相邻,那将不起作用。你真的需要更具体

【讨论】:

    【解决方案2】:

    好的,这很有趣。我花了一段时间,但这是一个可能的解决方案。我确信有更好的方法可以做到这一点,但这很有效。

    使用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>';

    【讨论】:

      猜你喜欢
      • 2021-07-10
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2022-07-06
      • 1970-01-01
      相关资源
      最近更新 更多