2013-07-24 13 views
7

Wszystko, co potrzebuję zrobić, to porównać dwie tablice obiektów i usunąć elementy w drugiej, które mają tę samą wartość właściwości. Na przykład:Porównaj dwie tablice obiektów i usuń elementy w drugiej, które mają tę samą wartość właściwości

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); 

Nie mogę zrozumieć, dlaczego to nie działa, a zamiast tego daje:

Uncaught TypeError: Cannot read property 'name' of undefined 

Co spodziewałem był następujący zawartość B:

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

Może z powodu redefinicji zmiennej 'len' w twoich pętlach –

Odpowiedz

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

Spróbuj tego:

Zaczynasz pętlę od 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

Twój problem jest, że splice() zmieni długość tablicy, tak aby wstępnie obliczane wartości len będzie zbyt duży, a wewnątrz pętli próby uzyskania dostępu do elementów niezdefiniowane.

Możliwym rozwiązaniem byłoby użyć metody filter():

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

Która również rozwiąże problem tego samego' len' w wewnętrznej i zewnętrznej pętli 'for'. – Andreas

0

Przyczyną jest to, że bezpośrednio splatać elementy z tablicy B chwilę jesteś w pętli for, a warunkiem wstępnym jest, że aib mają tę samą liczbę o f przedmiotów.

3

Wystarczy przerwie pętli wewnętrznej, gdy zostanie znaleziony:

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

porównaj i usunąć w tablicy object.Typically tablicy typu danych obiekt może być typeof jest object.So że trzeba przekształcić JSON stringify a następnie sprawdzić stan ..

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); 
 
         } 
 
        } 
 
       }

Powiązane problemy