2016-12-19 4 views
1

Я пытаюсь сравнить два объекта массивы что-то вродеJavascript сравнить 2 объекта массивы с где условия

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' 

Как я могу написать это в JavaScript?

+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

Вы можете собрать в хэш-таблице все id и name из list1 и проверить позже на существование.

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

Почему 'forEach' вместо' reduce'? – pwolaq

+0

, и он не будет работать, если в первом списке нет элемента с таким же идентификатором 'id', он выдает ошибку – pwolaq

+0

Потому что' reduce' возвращает каждый раз при одном и том же объекте. –

0

Как насчет сортировки обоих массивов по идентификатору, а затем итерация одновременно по обоим из них?

Это должно привести к сложности 2 * O(n*logn) + n, которая намного лучше, чем n^2, как предложено другим.

Смежные вопросы