2017-02-23 66 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 }) 
相关问题