2013-06-28 2 views
1

I 2 개 배열을 가지고조건부 병합 2 개 이차원 배열

arr1 = [ 
    ['itemid-1', 'itemclass', 'timestamp'], 
    ['itemid-2', 'itemclass', 'timestamp'], 
    ['itemid-3', 'itemclass', 'timestamp'], 
    ['itemid-5', 'itemclass', 'timestamp'] 
]; 

arr2 = [ 
    ['itemid-1', 'data-state', 'data-col'], 
    ['itemid-3', 'data-state', 'data-col'], 
    ['itemid-4', 'data-state', 'data-col'] 
]; 

결과적 같아야

arr1 = [ 
    ['itemid-1', 'itemclass', 'timestamp', 'data-state', 'data-col'], 
    ['itemid-2', 'itemclass', 'timestamp'], 
    ['itemid-3', 'itemclass', 'timestamp', 'data-state', 'data-col'], 
    ['itemid-5', 'itemclass', 'timestamp'] 
]; 

itemid-x가 동일 arr1arr2의 값을 병합 할.

for(i = 0; i < arr1.length; i++){ 
    for(j = 0; j < arr2.length; j++){ 
     if(arr1[i][0] == arr2[j][0]){ 
      arr1[i] = arr1[i].concat(arr2[j].slice(1)); 
     } 
    } 

} 

내가 사용 루프하여이 작업을 수행 할 수 있습니다

그러나 최근 underscorejs와 nodejs 시작, 그래서 나는 그것이 기존의 기능을 수행 할 수 있는지 알고 싶습니다.

추신 : this answer 흥미 롭습니다. 그러나 배열의 길이가 동일해야하며, itemid-x 색인이 두 배열에서 동일하지 않으면 작동하지 않습니다.

+0

코드가 작동하므로 더 좋은 방법을 찾고 싶습니까? – Patashu

+0

예 물론 저는 이미 밑줄을 사용하고 있으며 다른 라이브러리를 추가하는 데 신경 쓰지 않습니다. –

+1

코드에서 기본 JavaScript 함수를 사용합니다. IMHO, 당신은 다른 것을 필요로하지 않습니다. 그냥 사용하십시오. –

답변

1

정말 일을 더 잘 이해할 또는 간단하게 보이게 경우 나도 몰라,하지만 당신은

arr1.forEach(function(v, i){arr2.filter(function(v2){return v[0]==v2[0]}).forEach(function(v3){v3.slice(1).forEach(function(e){v.push(e)})})}); 

을 할 수있는 훨씬 더 JS 등의 확인 외모에 대한. ;)

많은 데이터 구조와 사용 사례가있어 데이터 구조에서 일반적인 경우를 파생시킬 수 없다고 생각합니다. 요소 [0]은 어떻게 든 특수하지만 코드에 반영되며 데이터 구조에는 반영되지 않습니다.

답변에서 고려한 것과 같이 흥미로운 점을 발견하면 데이터를 재구성 할 수 있습니까? arr2 = { itemid-1: [ ... ], itemid-2: [ ... ] }. 그렇다면 forEach 루프, 단순 조회 및 연결을 수행 할 수 있습니다 : arr1[i].concat(arr2[v])?

+0

감사합니다. 또한 arr2를 객체로 변경했습니다. –

1

코드가 올바르게 작동하지만이 문제를 개선 할 수 있습니다. 정렬 된 배열을 사용하기 때문에 m*n 반복을 사용하는 두 개의 루프가 필요하지 않습니다. 당신은 당신보다 더 라인을 가지고 m = arr1.length 및 N = arr2.length

var i = j = 0; 
var answer = []; 

while (i < arr1.length && j < arr2.length) 
{ 
    arr1ptr = arr1[i][0]; // Just for checking index 
    arr2ptr = arr2[j][0]; // You can extract 'id' if you want 

    if (arr1ptr == arr2ptr) 
    { 
     answer.push(arr1[i].concat(arr2[j].slice(1))); 
     i++; 
     j++; 
    } 
    else if (arr1ptr < arr2ptr) 
    { 
     answer.push(arr1[i]); 
     i++; 
    } 
    else if (arr1ptr > arr2ptr) 
    { 
     answer.push(arr2[j]); 
     j++; 
    } 
} 

두 배열을 병합 그것을 m+n 반복을 할 수 있지만, 그것은 빠릅니다. 사용하는 배열의 크기와 코딩의 용이성에 따라이를 사용하는 것이 좋습니다.

+0

이것은 좋지만 배열이 항상 정렬되지는 않습니다 (인덱스도 유지해야 함). 나의 모범으로서의 사과는 그것을 믿게 만들었을 것입니다. 다시 말하지만, 일치하지 않으면 arr1의 요소를 원하지만 arr2 요소는 무시해야합니다. 그 때문에'else if (arr1ptr