2016-08-24 4 views
0

R.mergeWith의 fn 기능과 n 개의 목록 항목 (예 : R.mergeAll)을 결합하는 권장 방법이나 기능이 있습니까?mergeWith for [Object]

나는

const data = [ 
    { a: 1, b: 2, c: 0, d: { e: 3 }}, 
    { a: 1, c: -1 }, 
    { a: 1, b: 4, c: 0, d: { e: 2 }} 
] 

을 가지고 추측 내가 (REPL에서)

R.mapAccum((a, b) => R.mergeWith(R.sum, a, b), {}, data) 

뭔가를 시도했습니다

{ a: 3, b: 6, c: -1, d: { e: 5 }} 

돌아가려면 키의 모든 값의 합계 싶은 나는 후에 병합하는 방법입니다. 이전 개체와 현재 개체를 일부 fn을 통해 처리합니다.

어떻게 기능 라이브러리를 통해 간결하고 순수한 방법으로이를 수행 할 수 있었는지 아이디어가 있습니까? 나는 Ramda를 선호하지만, 어떤 것도 훌륭 할 것입니다.

답변

1

Ramda 현재 mergeDeep 또는 mergeDeepWith 기능이 없습니다. 그러나 곧 추가 될 가능성이 있습니다. PR 1867을 참조하십시오. 그와

장소에, 당신은 단순히

R.reduce(R.mergeDeepWith(R.add), {}, data) 

당신이이 REPL처럼 일 것입니다 무슨의 시뮬레이션을 볼 수 있습니다 할 수 있습니다.

(당신은 sumreduce 때문에 수단이 한 번에 개체 중 하나 쌍의 작업보다는 add를 사용해야합니다. add이 두 숫자입니다, sum 그들의 목록입니다.)

+0

그게 좋습니다! 구현을 공유해 주셔서 감사합니다. 나는 그것에 대해 많은 것을 배울 것이다. – jiku

2

개체에 순환 구조가 없다고 가정하면 문제가 해결됩니다.

function merge(array){ 
    // Returns merged array 
    return mergeSubArray(array); 

    // This function recursively process all sub-arrays 
    function mergeSubArray(subArray){ 

    // Sum all properties of all objects in the array 
    return subArray.reduce(function(previousObject, currentObject){ 

     // Get all properties of an object 
     Object.keys(currentObject).forEach(function(keyOfCurrentObject){ 
     /* 
      For all properties we need to check whether this type if number or object. 
      If we encountered a number, we simply add it to previous sum. 
      Otherwise, if it is an object, call this function to it. 
     */ 

     if(typeof previousObject[keyOfCurrentObject] == 'number'){ 
      previousObject[keyOfCurrentObject] += currentObject[keyOfCurrentObject]; 
     }else{ 
      previousObject[keyOfCurrentObject] = mergeSubArray([previousObject[keyOfCurrentObject], currentObject[keyOfCurrentObject]]); 
     } 
     }); 

     // Returns merged objects 
     return previousObject; 
    }); 
    } 
} 
+0

이 더 나은 해답이 될 것입니다 a) 설명을 추가하고 b) 불행히도 단일 문자 변수 이름을 사용하고 심지어 내부 함수에서 일부를 그늘지게하기 때문에 초 명확하지 않은 재귀에 대해 경고해야합니다. –

+0

감사! 수정 사항을 롤백해서 죄송합니다. 저는 FP 라이브러리의 맥락에서 묻는 중이다. 특히 Ramda. 여기에 지금 여기에 upvoting. – jiku

+0

@ JaredSmith 제 코드가 어떻게 작동하는지는 분명하다고 생각했지만 괜찮습니다. 대답을 업데이트했습니다. –