2017-10-04 11 views
1

는 현재 Ramda에 나는 깊은 병합 할 경우 mergeDeepRight + mergeAll (... 아마도 mergeDeepRightAll) (오른쪽) 여러 개체 I를 ....: 내가 사용하는 경우

var a = _.mergeDeepRight({ one: 1 }, { two: { three: 3 } }) 
var b = _.mergeDeepRight(a, { three: { four: 4 } }) 
var c = _.mergeDeepRight(b, { four: { five: 5 } }) 

// c === { one:1, two: { three: 3 }, three: { four: 4 }, four: { five: 5 } } 

_.mergeAll (즉 _.mergeAll(a, b, c)을)를 { one:1, two: { three:3 } }_.mergeAll으로 반환합니다.

여러 개의 개체를 (오른쪽으로) 병합하는 더 깔끔한 방법이 있습니까? 우리가 하나에 일련의 항목을 변환하고 같이 뭔가 같은 ...

_.mergeDeepRightAll(a, b, c) 

답변

3

reduce, 여기에 좋은 호출 될 수 있습니다.

우리가

var a = mergeDeepRight({ one: 1 }, { two: { three: 3 } }) 
var b = { three: { four: 4 } } 
var c = { four: { five: 5 } } 

에 입력을 변경하는 경우 우리는

const mergeDeepAll = reduce(mergeDeepRight, {}) 

mergeDeepAll([a, b, c]) 

// -> {"four": {"five": 5}, "one": 1, "three": {"four": 4}, "two": {"three": 3}} 

을 수행 할 수 있습니다 그리고 당신은 배열로되지 인수를 제공하기를 원한다면, 당신은 unapply이 배열은 더, 수 있지만 인라인의 R.mergeAll의 서명

const mergeDeepAll = unapply(reduce(mergeDeepRight, {})) 

mergeDeepAll(a, b, c) 

시험 플러스에는 실제로 충돌하는 키가 없으므로 곧바로 R.mergeAll이 작동합니다. 그러나 당신이 언급 한 순서대로 출력하지 마십시오.

+0

출력 순서 : 객체 속성 순서는 ES 2015+만이 보장됩니다. OP는 어쨌든 그것에 의존해야합니다. –

+0

키 순서 변경은 대개 일부 출력 형식 (예 :'console.log' 또는'JSON.stringify') 때문입니다. 예, es6 이전에는 보장이 없었지만 엔진은 오랫동안 대부분 일관성이있었습니다. 따라서 keys (mergeDeepAll ([a, b, c])); // => [ "one", "two", "three", "four"]'. –

관련 문제