2016-06-30 2 views
1

어레이 (1) = 오브젝트]오브젝트가 존재하는지 2 배열과 비교

어레이 2 = 개체, 개체]

는 이제 어레이 (1) 객체 생각한이다 :

{ 
    'name': 'apple', 
    'id': '' 
} 

및 배열 2 :

오브젝트 1 :

{ 
    'name': 'bananna', 
    'id': 2 
} 

객체 2 :

{ 
    'name': 'apple', 
    'id': 1 
} 

내가 배열 1의 객체가 배열이있는 경우보고 싶어하고 있는지, 동일한 ID로 배열 1의 ID를 설정합니다. true 또는 객체 자체를 반환하고 배열 1에서 ID를 1로 변경해야합니다.

내 시도가 빠르다고 생각하지 마십시오. btw 두 배열은 모든 크기가 될 수 있습니다.

var itemFrom1; 
    for (var a = 0; a < array1.length; a++) { 
    itemFrom1 = array1[a]; 

    for(var b = 0; b < array2.length; b++) {        
     if (itemFrom1.name === array2[b].name) { 
     itemFrom1.id = array2[b].id; 
     } 
    } 
    } 

아마도 언더 코어 .js 또는 더 쉬운 방법을 사용할 수 있습니다.

var matched=_.findWhere(array2,{name:array1.name}) 

참고 : 모든 브라우저에서 작동하려면이 기능이 필요합니다.

+0

거기에 길잃은 달러 기호 무엇입니까? –

+0

등호를 검사하고 있습니다. 즉, array1의 첫 번째 요소가 array2의 첫 번째 요소와 이름이 같은지 확인하고 있습니다. 그런 다음 두 번째 요소가 두 번째 요소와 일치하는지 확인하는 등의 작업을 수행합니다. – JimN

+0

@ JimNastos 예, 그렇습니다. 접근 방법이 잘못되어 어떻게 해결할 수 있습니까? 인덱스가 다를 수 있습니다. – Angular

답변

2

당신이 시도 할 수 있습니다 : 그것은 list1의 모든 요소를 ​​통해 갈 것입니다 무엇을

list2의 모든 요소에 대한 이름을 확인하고에 일치하는 사람의 ID를 추가

var list1 = [ 
 
    { name: "apple" }, 
 
    { name: "grape" }, 
 
    { name: "orange" }, 
 
    { name: "watermelon" } 
 
]; 
 
var list2 = [ 
 
    { name: "apple", id: 1 }, 
 
    { name: "grapefruit", id: 2 }, 
 
    { name: "grape", id: 3 } 
 
]; 
 

 
for(item in list1) { 
 
    var match = list2.filter(function(obj) { 
 
    return obj.name == list1[item].name; 
 
    })[0] || false; 
 
    if(match) 
 
    list1[item].id = match.id; 
 
} 
 

 
console.log(list1);
. 귀하의 요청에 대한 응답으로


, I tested both of ours on JSFiddle 및 실현 d는 내 (느림) (performance.now()에 따르면 0.07999999999998408ms 대신 0.3799999999999386ms)입니다. 죄송합니다.

너의 작품은 아마 당신이 얻을 수있는 것처럼 직설적이다. 나는 그것에 충실을 말하고 싶지만.

+0

목록 1에서 ID를 정의해야합니까? 그리고 이것은 포도를 id 2로, 사과를 id 1로, 목록 1에서는 오른쪽으로 설정할 것입니까? – Angular

+0

또한 2 개의 for 루프보다 빠릅니다. – Angular

+0

@Angular'list2'에서 일치하지 않는 경우를 대비하여 일종의 기본값을 원한다면'id1' 속성을'list1'에 정의 할 필요는 없습니다. 그리고 예, '포도'의 ID는 2로 설정되고 '사과'는 1로 설정됩니다 (스 니펫을 실행하여 볼 수 있음). –

2

list1의 요소에 해시 테이블을 사용하고 id을 추가하기위한 참조로 사용하는 것이 좋습니다. 이 제안은 O (n + m)의 복잡성을 나타냅니다.

또는 사용하십시오 Map

var list1 = [{ name: "apple" }, { name: "grape" }, { name: "orange" }, { name: "watermelon" }], 
 
    list2 = [{ name: "apple", id: 1 }, { name: "grapefruit", id: 2 }, { name: "grape", id: 3 }], 
 
    hash = Object.create(null); 
 

 
list1.forEach(function (a) { 
 
    hash[a.name] = a; 
 
}); 
 

 
list2.forEach(function (a) { 
 
    if (hash[a.name]) { 
 
     hash[a.name].id = a.id; 
 
    } 
 
}); 
 

 
console.log(list1);

, 사용자 에이전트 지원이있는 경우.

var list1 = [{ name: "apple" }, { name: "grape" }, { name: "orange" }, { name: "watermelon" }], 
 
    list2 = [{ name: "apple", id: 1 }, { name: "grapefruit", id: 2 }, { name: "grape", id: 3 }], 
 
    map = new Map(); 
 

 
list1.forEach(a => map.set(a.name, a)); 
 
list2.forEach(a => (map.get(a.name) || {}).id = a.id); 
 

 
console.log(list1);

+0

왜 해시 맵이 아닌 해시 오브젝트를 사용합니까? 그것은 호환성을위한 것입니까? –

+0

@mortezaT, 실제로'Object'는'Map'보다 더 안정적입니다. –

+0

귀하의 답변이 너무 광범위합니다. 만약 당신이 설명 해 준 답이 있으면이 링크를 보내 주시겠습니까? –

0

귀하의 구현은 괜찮습니다, 난 그냥 추가 할 것 break; 항목을, 그렇지 않으면 당신은, 배열 2의 다른 모든 항목을 반복 항목을 상상합니다, 배열 2에서 발견 된 두 번째 루프 당신이 찾고있는 첫 번째 경우, 당신은 두 번째 휴식을하지 않으면 다음 N 반복 반복 for-loop

var itemFrom1; 
    for (var a = 0; a < array1.length; a++) { 
    itemFrom1 = array1[a]; 

    for(var b = 0; b < array2.length; b++) {        
     if (itemFrom1.name === array2[b].name) { 
     itemFrom1.id = array2[b].id; 
     break; // Stops the second loop, go on with the next value from array1! 
     } 
    } 
    }