2017-02-23 134 views
0

我想匹配兩個json文件的id並返回匹配的對象。這些都是2 JSON文件:如何根據匹配的ID返回一個對象數組?

{ 
    "een": { 
    "id": "100", 
    "title": "Entertainment and stuff" 
    }, 
    "twee": { 
    "id": "107", 
    "title": "Sport for everyone" 
    }, 
    "drie": { 
    "id": "108", 
    "title": "Eating is good" 
    } 
} 

這是第二個:

[ 
    { 
    "name": "Entertainment", 
    "id": "100", 
    "price": 2600, 
    "gifted": false 
    }, 
    { 
    "name": "Sport", 
    "id": "107", 
    "price": 2500, 
    "gifted": false 
    } 
] 

由於2個匹配idvalues的結果,我應該得到:

[ 
    { 
    "name": "Entertainment", 
    "id": "100", 
    "price": 2600, 
    "gifted": false, 
    "title": "Entertainment and stuff" 
    }, 
    { 
    "name": "Sport", 
    "id": "107", 
    "price": 2500, 
    "gifted": false, 
    "title": "Sport for everyone" 
    } 
] 

我在想,如果有一種奇特的方式使用lodash或其他東西,並以一個很好的緊湊方式做到這一點?

回答

0

一種可能的解決方案是使用merge合併兩個以id爲關鍵的對象。這可以使用陣列上的keyBy以及第一個對象的值來完成。使用Intersection查找兩個數組中的id。對@ GruffBunny的回答

let list1 = { 
    "een": { 
    "id": "100", 
    "title": "Entertainment and stuff" 
    }, 
    "twee": { 
    "id": "107", 
    "title": "Sport for everyone" 
    }, 
    "drie": { 
    "id": "108", 
    "title": "Eating is good" 
    } 
} 

let list2 = [ 
    { 
    "name": "Entertainment", 
    "id": "100", 
    "price": 2600, 
    "gifted": false 
    }, 
    { 
    "name": "Sport", 
    "id": "107", 
    "price": 2500, 
    "gifted": false 
    } 
] 

let o1 = _.keyBy(_.values(list1), 'id'); 
let o2 = _.keyBy(list2, 'id'); 

let matchingIds = _.intersection(_.keys(o1), _.keys(o2)); 

let result = _.chain(o1) 
    .pick(matchingIds) 
    .merge(_.pick(o2,matchingIds)) 
    .values() 
    .value() 
+0

您錯過了最後一步。我認爲OP只想合併那些id匹配的對象。所以你的結果應該以某種方式忽略id爲108的對象。 – jusopi

+0

我的不好。感謝您指出了這一點。 –

0

大廈,你希望把他的結果,並篩選出未在o1o2發現這些ID。

let o1 = _.keyBy(_.values(list1), 'id')); 
let o2 = _.keyBy(list2, 'id'); 

let idsToPull = _.difference(_.map(o1, 'id'), _.map(o2, 'id')) //["108"] 
let merged = _.values(_.merge(o1, o2)); 

let result = _.filter(merged, function(obj){ return _.indexOf(idsToPull, obj.id) === -1 }) 
相關問題