14

オブジェクトの 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);

なぜこれが機能しないのか理解できず、代わりに次のようになります。

Uncaught TypeError: Cannot read property 'name' of undefined

私が期待したのは、bの次の内容でした:

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

8 に答える 8

4

問題は、splice()配列の長さが変更されるため、事前計算されたlen値が大きくなりすぎて、ループ内で未定義の要素にアクセスしようとすることです。

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

フィドルの例

于 2013-07-24T09:50:26.550 に答える
3

一致が見つかったら、内側のループを中断する必要があります。

if (a[i].name == b[j].name) {
    b.splice(j, 1);
    break;
}
于 2013-07-24T11:04:48.910 に答える
1

これを試して:

からループを開始してい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);
            }
        }
    }

フィドルのデモ

于 2013-07-24T09:48:07.753 に答える
1

オブジェクトの配列で比較して削除します。通常、オブジェクト データ型の配列は typeOf が object である可能性があります。そのため、JSON 文字列化に変換してから条件を確認する必要があります。

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

于 2014-10-02T18:39:31.220 に答える
0

根本的な原因は、for ループにいるときに配列 b から項目を直接スプライスし、前提条件が a と b に同じ数の項目があることです。

于 2013-07-24T09:52:13.630 に答える