2016-12-19 9 views
1

で2つのオブジェクトの配列を比較私はJavaScriptでこれを書くことができますどのようにJavascriptがどこ条件

list1 = [{id:1,name:'amy'},{id:3,name:'zoe'}]; 
list2 = [{id:1,name:'sally'},{id:3,name:'zoe'}];  

select * 
from list1 a, list2 b 
where a.id = b.id 
and a.name = b.name 

Result: id:3, name:'zoe' 

のようなものを2つのオブジェクトの配列を比較しようとしていますか?

+0

スペースと時間の制約は何ですか? –

+0

このような目的のために特別に作られたカスタムライブラリを使用することをお勧めします。 [lodash](https://lodash.com/)。 – 31piy

答えて

4

両方の配列をループして値を一致させる必要があります。

list1 = [{id:1,name:'amy'},{id:3,name:'zoe'}]; 
 
list2 = [{id:1,name:'sally'},{id:3,name:'zoe'}]; 
 
var r = []; 
 

 
list1.forEach(function(a){ 
 
    return list2.forEach(function(b){ 
 
    if(a.id === b.id && a.name === b.name) 
 
     r.push(b) 
 
    }) 
 
}); 
 
console.log(r)

3

あなたはこれを試すことができます。

var list1 = [{id:1,name:'amy'},{id:3,name:'zoe'}]; 
 
var list2 = [{id:1,name:'sally'},{id:3,name:'zoe'}]; 
 
var r = list1.filter(x => list2.some(y => x.name == y.name && x.id == y.id))[0]; 
 
console.log(r);

+0

あなたは 'id'をどこで比較していますか? – pwolaq

1

あなたは、ハッシュテーブルのすべてのidlist1nameに収集し、存在する後で確認することができます。 idで両方の配列をソートし、それらの両方の上に同時に反復について

var list1 = [{ id: 1, name: 'amy' }, { id: 3, name: 'zoe' }], 
 
    list2 = [{ id: 1, name: 'sally' }, { id: 3, name: 'zoe' }], 
 
    list1hash = Object.create(null), 
 
    result; 
 
     
 
list1.forEach(function (a) { 
 
    list1hash[[a.id, a.name].join('|')] = a; 
 
}); 
 

 
result = list2.filter(function (a) { 
 
    return list1hash[[a.id, a.name].join('|')]; 
 
}); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

なぜ 'reduce'ではなく' forEach'ですか? – pwolaq

+0

であり、最初のリストに同じidを持つ項目がない場合は機能しません。同じオブジェクトが返されるたびにエラー – pwolaq

+0

が返されます。 –

0

どのように?

は、n^2よりもはるかに優れた2 * O(n*logn) + nの複雑さをもたらすはずです。