2013-07-24 8 views
7

2つのオブジェクトの配列を比較し、同じプロパティ値を持つ2つ目のオブジェクトを削除するだけです。オブジェクトの2つの配列を比較し、同じプロパティ値を持つ2番目のアイテムを削除します

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

...文字列化JSONに変換して、状態を確認する必要がありますあなたのループ内の '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項目。

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

あなただけの一致が検出された内部ループが休憩に必要

たぶん

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

0

を比較すると、オブジェクトのデータ型のobject.Typically配列の配列に削除typeof演算がobject.Soたちということである場合があります

関連する問題