2013-07-24 15 views
7

Tek yapmam gereken iki nesne dizisini karşılaştırmak ve ikinci öğede aynı özellik değerine sahip öğeleri kaldırmaktır.Nesnelerin iki dizisini karşılaştırın ve aynı özellik değerine sahip ikinci öğede öğeleri kaldırın

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

bu işe ve bunun yerine verir vermez neden anlayamıyorum:

[{'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); } } }
döngüleri –

cevap

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

bu deneyin: Beklediğim ne

Uncaught TypeError: Cannot read property 'name' of undefined 

b aşağıdaki memnundu

Örneğin

Döngüyü 0'dan başlatıyorsunuz.

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

Senin sorunun da ön hesaplaması len değeri çok büyük olacak ve döngü içinde size tanımsız elemanlar erişmeye çalıştığınızda, böylece splice(), dizinin uzunluğunu değişeceğini vardır.

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

'len' değişkeninin yeniden tanımlanması nedeniyle Bu da aynı' len' sorununun iç ve dış 'for' döngüsünde düzeltecektir. – Andreas

0

kök neden doğrudan dizi b süre öğeleri üzerinde kesikler şudur:

Muhtemel bir çözüm filter() yöntemi kullanmak olacaktır for döngüsündesiniz ve ön koşul a ve b aynı numaraya sahip f öğeler.

sadece aradan Bir eşleşme bulunduğunda iç döngü gerekir
3

:

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

karşılaştırmak ve typeof olabilir nesne veri türünün object.Typically dizisinin dizisinde kaldırmak object.So biziz .. durumunu kontrol sonra JSON stringify dönüştürmek ve gerek Belki

İlgili konular