2016-10-29 2 views
2

두 객체 배열을 병합하려고합니다.lodash 속성을 사용하여 2 개의 정렬 된 객체 배열을 합치십시오.

개체 배열을 미리 정렬하여 일치되도록했습니다. 두 배열에서 각 개체의 속성을 밀어 넣기 만하면됩니다.

로다시는 double for 루프보다 깨끗한 솔루션을 제공 할 것이라고 생각합니까? 아니면 그냥 바닐라 JS 솔루션을 수행해야합니까? 두 배열의

예 :

[ 
    { 
     provider: 'foo', 
     title: 'Title1' 
    }, 
    { 
     provider: 'bar', 
     title: 'Title2' 
    } 
] 

[ 
    { 
     all: '0', 
     novelty: '24' 
    }, 
    { 
     all: '4', 
     novelty: '12' 
    } 
] 

그것은 반환해야합니다 :

[ 
    { 
     provider: 'foo', 
     title: 'Title1', 
     all: '0', 
     novelty: '24' 
    }, 
    { 
     provider: 'bar', 
     title: 'Title2', 
     all: '4', 
     novelty: '12' 
    } 
] 
+0

lodash이로드되면 당신은 손에있는 도구를 사용하여, 사용 :

예를 들어, 여기 http://www.algolist.net/Algorithms/Merge/Sorted_arrays의 JS 구현입니다. –

+0

단지 nitpick에 해당하는 JS 배열이지만 유효한 JSON은 아닙니다. –

+1

공정한. 죄송합니다. 객체가 API 호출에서 반환되었지만 문제와 관련이 없습니다. – Tulun

답변

2

lodash없이 당신이 Array.prototype.map()Object.assign() 사용할 수 있습니다 (또는 angular.merge()을 할당이 대상 브라우저에서 지원되지 않는 경우) :

var arr1 = [{ 
 
     provider: 'foo', 
 
     title: 'Title1' 
 
    }, { 
 
     provider: 'bar', 
 
     title: 'Title2' 
 
    }]; 
 

 
    var arr2 = [{ 
 
     all: '0', 
 
     novelty: '24' 
 
    }, { 
 
     all: '4', 
 
     novelty: '12' 
 
    }]; 
 

 
    var result = arr1.map(function(item, index) { 
 
     return Object.assign({}, item, arr2[index]); 
 
    }); 
 

 
    console.log(result);
당신이 _.assign()와 lodash 사용 _.zipWith()를 사용하려면

:

var arr1 = [{ 
 
    provider: 'foo', 
 
    title: 'Title1' 
 
}, { 
 
    provider: 'bar', 
 
    title: 'Title2' 
 
}]; 
 

 
var arr2 = [{ 
 
    all: '0', 
 
    novelty: '24' 
 
}, { 
 
    all: '4', 
 
    novelty: '12' 
 
}]; 
 

 
var result = _.zipWith(arr1, arr2, function(a, b) { 
 
    return _.assign({}, a, b); 
 
}); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>

+0

이것은 효과가 있었지만 (lodash가 없음). 내가 필요로하는 경우에 대비하여 프로젝트에 로다시를 주입하는 방법을 알아낼 수 있는지 알아 보겠다. (이것은 앵귤러 프로젝트이다.) 그러나 전적으로 사소한 것이 아니기 때문에 앞으로 나아갈 것을 결정했다. – Tulun

+0

map, reduce, forEach, every, some 등 ... 및 각도의 유틸리티, 예를 들어 병합과 같은 배열 메소드를 사용하면 거의 lodash가 필요하지 않습니다. lodash를 포함 시키려면 전역 서비스로 수행하거나 각도 서비스로 감쌀 수 있습니다. –

2

을 당신은 ES6으로이 작업을 수행 할 수 있습니다

data1.map((obj, i) => Object.assign({}, obj, data2[i])) 

var data1 = [{ 
 
     provider: 'foo', 
 
     title: 'Title1' 
 
    }, { 
 
     provider: 'bar', 
 
     title: 'Title2' 
 
    }]; 
 
var data2 = [{ 
 
     all: '0', 
 
     novelty: '24' 
 
    }, { 
 
     all: '4', 
 
     novelty: '12' 
 
    }]; 
 

 
var merged = data1.map((obj, i) => Object.assign({}, obj, data2[i])); 
 

 
console.log(merged);

+0

나는 이것을 ES6 설탕없이 사용했고 효과가 있었다. – Tulun

+0

알려 주셔서 감사합니다 ;-) – trincot

0

지금까지이 질문에 대한 다른 대답은 입력 배열이 사전 정렬 된 명시된 조건을 무시한다는 점에서 차선책입니다. AFAIK lodash에는 미리 정렬 된 배열을 병합하는 방법이 없지만 "병합 정렬 된 배열"에 대한 Google 검색은 에뮬레이트 할 많은 의사 코드를 나타냅니다.

const mergeSortedArraysBy = (array1, array2, iteratee) => { 
    const mergedArray = []; 
    let i = 0; 
    let j = 0; 
    while (i < array1.length && j < array2.length) { 
     if (iteratee(array1[i]) <= iteratee(array2[j])) { 
      mergedArray.push(array1[i]); 
      i++; 
     } else { 
      mergedArray.push(array2[j]); 
      j++; 
     } 
    } 
    if (i < array1.length) { 
     for (let p = i; p < array1.length; p++) { 
      mergedArray.push(array1[p]); 
     } 
    } else { 
     for (let p = j; p < array2.length; p++) { 
      mergedArray.push(array2[p]); 
     } 
    } 
    return mergedArray; 
}; 
관련 문제