2016-07-01 1 views
2

을 사용하여 Lodash's merge에 해당하는 함수를 찾으려고합니다. 재귀 개체 키 기반 "병합"또는 "확장"을 수행합니다.Ramda를 재귀 적으로 "병합"또는 "확장"하시겠습니까?

let merged = R.someMethod(
    { name: 'Matt', address: { street: 'Hawthorne', number: 22, suffix: 'Ave' }}, 
    { address: { street: 'Pine', number: 33 }} 
); 

console.log(merged); 

// => { name: 'Matt', address: { street: 'Pine', number: 33, suffix: 'Ave' }} 

내가 R.set 간략하게 소개 된 것을 다음 pull request에서 발견, 곧 그 후 다음 rolled back : 동작은 다음과 유사합니다. 이 기능은 Ramda 라이브러리에 의해 캡처 된 적이 있습니까?

Ramda에서이 기능을 사용할 수 있습니까?

답변

2

Ramda는 현재이 기능을 포함하지 않습니다.

하나를 만들려고 여러 시도가 있었지만 실제로는 그러한 기능에 실제로 필요한 요소를 창안하는 것처럼 보입니다.

추가 가치가 있다고 생각한다면 raise an issue으로 자유롭게 움직여야합니다.

+0

가 나는 문제를 만들 가치가 있다고 생각,하지만 난 정말 테이블에 어떤 미묘한 의견을 가지고하지 않는 등 정의되지 않은 값, 병합 배열, 해결하는 방법에 대해 똑같은 비트를 재탕 싫어 , 그리고 나는 그 자체로 기능을 가지고 싶은 욕망이이 시점에서 매우 큰 소리로 말하고 있는지 확신하지 못합니다 ... – Himmel

+0

물론 당신이 좋아하는 것처럼. 나는 그런 기능을 추가하기위한 계속적인, 그러나 아주 낮은 압력이 있다고 생각한다. 그러나 프로토 타입 체인, 정의되지 않은 구조 및 순환 구조에도 불구하고 API가 환상적으로 보이지 않기 때문에 나를 비롯한 많은 사람들이 저항했습니다. 그러나 완벽한 존재가 선의적일 수 있습니다. –

6

비교적 단순한 재귀 함수는 R.mergeWith을 사용하여 만들 수 있습니다.

function deepMerge(a, b) { 
    return (R.is(Object, a) && R.is(Object, b)) ? R.mergeWith(deepMerge, a, b) : b; 
} 

deepMerge({ name: 'Matt', address: { street: 'Hawthorne', number: 22, suffix: 'Ave' }}, 
      { address: { street: 'Pine', number: 33 }}); 

//=> {"address": {"number": 33, "street": "Pine", "suffix": "Ave"}, "name": "Matt"} 
+0

이 함수를 사용하는 방법에 따라 다르 겠지만, 값의 형식에도 불구하고 첫 번째 인수로 전달 된 일치하는 키/값을 덮어 쓰려면 두 번째 인수로 전달되는 키/값을 선호합니다. 이러한 기능은'(R.is (Object, b))? ... '(R.is (Object, a))가 아닌 ...'이됩니다. – Himmel

+1

만약 당신이 잠재적으로 동일한 키에서 다른 타입을 다루고 있다면'mergeWith'를 호출하기 전에'a'와'b'가 모두 객체인지 점검해야합니다. 나는 그것을 반영하기 위해 예제를 업데이트했다. –

+0

간단한 배열로 작업 할 수 있도록 약간 수정 된 버전'''const deepMerge = (a, b) => R.isArrayLike (b) &&! R.is (Object, b [0]) ? b : (R.is (Object, a) && R.is (Object, b))? R.mergeWith (deepMerge, a, b) : b''' – baio