2013-07-24 8 views
7

Tutto ciò che devo fare è confrontare due matrici di oggetti e rimuovere gli elementi nella seconda che hanno lo stesso valore di proprietà. Per esempio:Confronta due matrici di oggetti e rimuovi gli elementi nella seconda che hanno lo stesso valore di proprietà

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

non riesco a capire il motivo per cui questo non funziona e invece dà:

Uncaught TypeError: Cannot read property 'name' of undefined 

Quello che mi aspettavo era il seguente contenuto in B:

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

Forse a causa della ridefinizione della variabile 'len' nei tuoi loop –

risposta

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

Prova questa:

Si sta iniziando il ciclo da 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

Il tuo problema è, che splice() cambierà la lunghezza della matrice, in modo che il valore len precalcolata sarà troppo grande e l'interno del ciclo si tenta di accedere agli elementi indefiniti.

Una possibile soluzione sarebbe quella di utilizzare il metodo 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

Che risolverà anche il problema dello stesso' len' nel ciclo interno ed esterno 'for'. – Andreas

0

La causa principale è che unisci direttamente articolo dalla matrice b mentre sei nel ciclo for e la pre condizione è a eb hanno lo stesso numero o articoli di f.

3

Hai solo bisogno di pausa il ciclo interno quando viene trovata una corrispondenza:

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

confronto e rimuovere in serie di object.Typically matrice di tipo di dati oggetto può essere TypeOf è object.So che abbiamo bisogno di convertire in JSON stringa i e quindi controllare lo stato ..

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

Problemi correlati