2016-05-03 14 views
-3

似たようなjsonキーを組み合わせて冗長データを排除する方法が不思議でした。つまり、データが重複するのではなく、同じキーで類似した値をどのように連結しますか?私は現在、JSONデータは次のように探していますjavascriptを使用して同様の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"}] 
    } 
] 
+0

、何photo_idキーは?あなたはそれで何をしたいですか? –

+0

これを正しく実行したい場合(深くマージする必要がある場合もあります)、 'lodash'を使用してください!私の最後の質問をチェックアウト:http://stackoverflow.com/questions/36928983/how-can-i-merge-an-array-of-objects – James111

答えて

0

使用reduce

ビーイングinitialあなたが設けられた第一の配列:

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

これは、基本的に配列i最初の要素を配列に入れておくと、異なる値を持つオブジェクトがある場合、それは十分にスマートになりません。もっと具体的にしてください。

特定のプロパティで値が同じ場合にのみ、2つのオブジェクトを最初のオブジェクトにマージする必要があるかどうかを推測したい場合は、これを探してください。

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

また、類似オブジェクトが互いに隣接していない場合は、これが再び機能しません。あなたは本当にもっと具体的にする必要があります

0

これは一種の楽しみでした。私にはしばらく時間がかかりましたが、ここでは可能な解決策の1つがあります。これを行うより良い方法があると確信していますが、これはうまくいきます。

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

関連する問題