2016-06-30 14 views
1

アレイ1 = [対象]は、オブジェクトが存在するかどうかを確認するために2つの配列を比較

アレイ2 = [オブジェクト、オブジェクト]

だがアレイ1つのオブジェクトにしましょうがある:

{ 
    'name': 'apple', 
    'id': '' 
} 

アレイ2:

オブジェクト1:

{ 
    'name': 'bananna', 
    'id': 2 
} 

オブジェクト2:

{ 
    'name': 'apple', 
    'id': 1 
} 

私は、アレイ1内のオブジェクトが配列2であるかどうかを確認したい、それがある場合は、同じIDに配列1のIDを設定します。 trueまたはオブジェクト自体を返し、配列1でidを1に変更する必要があります。

私の試行は速いとは思わないでください。 btwどちらの配列も任意のサイズにできます。

var itemFrom1; 
    for (var a = 0; a < array1.length; a++) { 
    itemFrom1 = array1[a]; 

    for(var b = 0; b < array2.length; b++) {        
     if (itemFrom1.name === array2[b].name) { 
     itemFrom1.id = array2[b].id; 
     } 
    } 
    } 

おそらく、私はアンダースコア.jsまたは簡単な方法を使用できます。

var matched=_.findWhere(array2,{name:array1.name}) 

注:すべてのブラウザで動作する必要があります。

+0

迷惑なドル記号は何ですか? –

+0

等号をチェックしています。つまり、array1の最初の要素がarray2の最初の要素と同じ名前を持っているかどうかを確認しています。次に、2番目の要素が2番目の要素に一致するかどうかを確認します。 – JimN

+0

@JimNastosええ、私は気づいたので、私のアプローチが間違っているので、どのように修正するのですか?インデックスは異なる可能性があります – Angular

答えて

2

あなたはこれを試すことができます:どのようなそれがないことlist1内のすべての要素を通過している

list2内のすべての要素に対して名前をチェックし、

var list1 = [ 
 
    { name: "apple" }, 
 
    { name: "grape" }, 
 
    { name: "orange" }, 
 
    { name: "watermelon" } 
 
]; 
 
var list2 = [ 
 
    { name: "apple", id: 1 }, 
 
    { name: "grapefruit", id: 2 }, 
 
    { name: "grape", id: 3 } 
 
]; 
 

 
for(item in list1) { 
 
    var match = list2.filter(function(obj) { 
 
    return obj.name == list1[item].name; 
 
    })[0] || false; 
 
    if(match) 
 
    list1[item].id = match.id; 
 
} 
 

 
console.log(list1);
にマッチしたもののIDを追加します。あなたの要求に応じて


、I tested both of ours on JSFiddleと実現dは私のものが(performance.now()によると0.07999999999998408msの代わりに0.3799999999999386ms)であった。おっとっと。

あなたの作品は、あなたが得ることができるほど簡単です。私はそれに固執すると思います。

+0

リスト1のIDを定義する必要はありませんか?また、これはid 1とid 2にブドウを設定し、リスト1ではid 1に設定します。 – Angular

+0

また、これは私が今持っている2 forループよりも速いですか? – Angular

+0

@Angular 'list2'で一致するものがない場合に、デフォルト値の並べ替えを必要としない限り、' list'で 'id'プロパティを定義する必要はありません。そして、はい、 'grape'のidは2に設定され、appleの値は1に設定されます(これはスニペットを実行することで確認できます)。 –

2

list1の要素にハッシュテーブルを使用し、idを追加するための参照として使用することをお勧めします。この提案は、O(n + m)という複雑さを持っています。

var list1 = [{ name: "apple" }, { name: "grape" }, { name: "orange" }, { name: "watermelon" }], 
 
    list2 = [{ name: "apple", id: 1 }, { name: "grapefruit", id: 2 }, { name: "grape", id: 3 }], 
 
    hash = Object.create(null); 
 

 
list1.forEach(function (a) { 
 
    hash[a.name] = a; 
 
}); 
 

 
list2.forEach(function (a) { 
 
    if (hash[a.name]) { 
 
     hash[a.name].id = a.id; 
 
    } 
 
}); 
 

 
console.log(list1);

またはあなたのユーザエージェントがそれをサポートしている場合、Mapを使用しています。

var list1 = [{ name: "apple" }, { name: "grape" }, { name: "orange" }, { name: "watermelon" }], 
 
    list2 = [{ name: "apple", id: 1 }, { name: "grapefruit", id: 2 }, { name: "grape", id: 3 }], 
 
    map = new Map(); 
 

 
list1.forEach(a => map.set(a.name, a)); 
 
list2.forEach(a => (map.get(a.name) || {}).id = a.id); 
 

 
console.log(list1);

+0

ハッシュマップではなくハッシュオブジェクトを使用する理由それは互換性のためですか? –

+0

@mortezaT、実際には 'Object'は' Map'よりも信頼性が高いです。 –

+0

あなたの答えは広すぎます。あなたが説明した答えがあれば、このリンクを送れますか? –

0

あなたの実装はOKですが、私はちょうど項目が配列2で発見されたときに、第2ループにbreak;を追加し、そうでなければ、配列2に他のすべての項目を反復処理するような、アイテムを想像あなたが探しているのは、最初のものです。次のNを繰り返します。もしも二番目のものを壊さなければ、for-loop

var itemFrom1; 
    for (var a = 0; a < array1.length; a++) { 
    itemFrom1 = array1[a]; 

    for(var b = 0; b < array2.length; b++) {        
     if (itemFrom1.name === array2[b].name) { 
     itemFrom1.id = array2[b].id; 
     break; // Stops the second loop, go on with the next value from array1! 
     } 
    } 
    } 
関連する問題