Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用javascript组合类似的JSON键_Javascript_Json_Node.js - Fatal编程技术网

如何使用javascript组合类似的JSON键

如何使用javascript组合类似的JSON键,javascript,json,node.js,Javascript,Json,Node.js,我想知道如何将相似的json键组合在一起以消除冗余数据。换句话说,如何在同一个键下连接相似的值,而不是重复数据?我目前有如下的json数据: [ { "listing_id": 1, "furniture_id": 2, "price": 129.99, "duration": null, "photo_id": 1, "url": "http://d3otkl9byfilk1.cloudfr

我想知道如何将相似的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"}]
    }
]
如何组合冗余键使其看起来像这样:

[
    {
        "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;
});

同样,如果similar对象不是相邻的,那么这将不起作用。你真的需要说得更具体些好吧这很有趣。我花了一段时间,但这里有一个可能的解决办法。我相信有更好的方法,但这很有效

使用和(ES6):

const listings=[{//具有多个列表id和重复项的示例列表
“清单id”:1,
“家具标识”:2,
“价格”:129.99,
“持续时间”:空,
“照片id”:1,
“url”:”http://d3otkl9byfilk1.cloudfront.net/images/COHG3---A_Graceland-Silver-With-Malva-Blue-Grey-Contrast"
}, {
“清单id”:1,
“家具标识”:2,
“价格”:129.99,
“持续时间”:空,
“照片id”:2,
“url”:”https://www.responsive-checkout.com/demo/media/catalog/product/cache/1/image/9df78eab33525d08d6e5fb8d27136e95/c/o/couch.jpg"
}, {
“清单id”:1,
“家具标识”:2,
“价格”:129.99,
“持续时间”:空,
“照片id”:2,
“url”:”https://example.com"
}, {
“清单id”:2,
“家具标识”:2,
“价格”:129.99,
“持续时间”:空,
“照片id”:2,
“url”:”https://www.responsive-checkout.com/demo/media/catalog/product/cache/1/image/9df78eab33525d08d6e5fb8d27136e95/c/o/couch.jpg"
}, {
“清单id”:2,
“家具标识”:2,
“价格”:129.99,
“持续时间”:空,
“照片id”:2,
“url”:”https://example2.com"
}, {
“清单id”:3,
“家具标识”:2,
“价格”:129.99,
“持续时间”:空,
“照片id”:2,
“url”:”https://example3.com"
}];
常量重复项=[];
const filteredListings=listings.filter((listing,index,self)=>{//过滤掉所有重复项
const found=self.findIndex(i=>i.listing\u id==listing.listing\u id);
如果(找到!==索引){
duplicates.push(列表);//将重复项添加到重复数组中,以便稍后添加回。
返回false;
}否则返回true;
});
duplicates.forEach((duplicate)=>{//循环遍历重复项以将url添加回主数组
const listIndex=filteredListings.findIndex(listing=>listing.listing\u id==duplicate.listing\u id);
if(Array.isArray(filteredListings[listIndex].url)){
filteredListings[listIndex].url.push(重复的.url);
}else filteredListings[listIndex].url=[filteredListings[listIndex].url,重复.url];
});

document.body.innerHTML=''+JSON.stringify(filteredListings,0,4)+''那么照片id键呢?你想用它做什么?如果你想正确地做这件事(有时你可能需要更深入地合并),你应该使用
lodash
!结帐我最后的一个问题: