2017-02-23 3 views
0

두 개의 json 파일의 ID를 일치시키고 일치하는 개체를 반환하려고합니다. 내가 가야 2 일치 idvalues의 결과로일치하는 ID를 기반으로 객체 배열을 반환하려면 어떻게해야합니까?

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

:

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

나는 궁금했다

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

이 두 번째입니다 : 다음은이 JSON 파일입니다 lodash 또는 다른 것을 사용하는 멋진 방법이 있었고 멋진 압축 방법으로 이것을합니까?

답변

0

id 키를 가진 두 개체를 병합하려면 merge을 사용하는 것이 좋습니다. 이 작업은 배열에서 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가 일치하는 객체 만 병합하려고합니다. 그래서 당신의 결과는 어떻게 든 108의 ID를 가진 객체를 생략해야합니다. – 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 }) 
관련 문제