2013-07-24 1 views
7

두 개의 객체 배열을 비교하고 두 번째 객체에서 동일한 속성 값을 가진 항목을 제거하면됩니다.두 개의 객체 배열을 비교하고 같은 속성 값을 가진 두 번째 객체의 항목을 제거하십시오.

var a = [{'name':'bob', 'age':22}, {'name':'alice', 'age':12}, {'name':'mike', 'age':13}]; 
var b = [{'name':'bob', 'age':62}, {'name':'kevin', 'age':32}, {'name':'alice', 'age':32}]; 

function remove_duplicates(a, b) { 
    for (var i = 0, len = a.length; i < len; i++) { 
     for (var j = 0, len = b.length; j < len; j++) { 
      if (a[i].name == b[j].name) { 
       b.splice(j, 1); 
      } 
     } 
    } 

    console.log(a); 
    console.log(b); 

} 

console.log(a); 
console.log(b); 

remove_duplicates(a,b); 

이 작업을 대신 제공하지 않는 이유를 이해 할 수 없습니다 :

[{'name':'kevin', 'age':32}]; 
+0

for(var i=0; i < a.length; i++) { for(var j=0; j < b.length; j++) { if(JSON.stringify(a[i]) == JSON.stringify(b[j])) { a.splice(i, 1); } } }
당신의 루프에서'len' 변수를 재정의했기 때문에 –

답변

10

FIDDLE

for (var i = 0, len = a.length; i < len; i++) { 
     for (var j = 0, len2 = b.length; j < len2; j++) { 
      if (a[i].name === b[j].name) { 
       b.splice(j, 1); 
       len2=b.length; 
      } 
     } 
    } 
1

이 시도 : 내가 기대했던

Uncaught TypeError: Cannot read property 'name' of undefined 

가 B에서 다음과 같은 내용이었다

예를 들어

0에서 루프가 시작됩니다.

for (var i = 0, len = a.length; i < len; i++) { 
     for (var j = 0, len = b.length; j < len-1; j++) { 
      if (a[i].name == b[j].name) { 
       b.splice(j, 1); 
      } 
     } 
    } 

Fiddle Demo

1

귀하의 문제는 미리 계산 len 값이 너무 큰 것 루프 내부의 사용자가 정의되지 않은 요소에 액세스하려고 할 수 있도록 splice()는, 배열의 길이를 변경할 것입니다.

function remove_duplicates(a, b) { 

    b = b.filter(function(item) { 
     for(var i=0, len=a.length; i<len; i++){ 
      if(a[i].name == item.name) { 
       return false; 
      } 
     } 
     return true; 
    }); 

    console.log(a); 
    console.log(b); 
} 

Example Fiddle

+0

또한 내부와 외부'for' 루프에서 같은'len' 문제를 수정합니다. – Andreas

0

근본 원인은 직접 배열 b의 동안에서 항목을 접합하기 때문이다 :

가능한 솔루션은 filter() 방법을 사용하는 것입니다 당신은 for 루프에 있고 pre 조건은 a이고 b는 같은 수입니다 o f 항목.

그냥 휴식 일치가 발견되는 내부 루프에 필요
3

:

if (a[i].name == b[j].name) { 
    b.splice(j, 1); 
    break; 
} 
0

비교하고 대해서 typeof 수 있습니다 개체 데이터 형식의 object.Typically 배열의 배열의 제거는 object.So 우리입니다 .. 상태를 점검 한 후 JSON의 캐릭터 라인 화에 변환 할 필요가 어쩌면

관련 문제