2017-01-26 3 views
1

У меня 2 массивов в виде:Пересечение значений 2 массивов объектов

array1 = [{key1: value1}, {key1: value2}, ...]; 
array2 = [{key2: value0}, {key2: value2}, ...]; 

, где объект ключей в обоих массивов различны, но эти значения могут совпадать. Я хотел бы написать код, который получает пересечение между двумя массивами, где в приведенном выше примере он должен возвращать: [value2].

Я попытался с помощью:

array1.filter(function(n)) { 
    return array2.indexOf(n) != -1; 
}); 

, но, конечно, я получил пустой массив из-за несоответствия ключей. Можно ли изменить приведенный выше код, чтобы игнорировать ключи объекта и соответствовать только их значениям?

+0

@NinaScholz Yep, тот же ключ в каждом массиве. – SalmaFG

+0

Нет, извините, это была синтаксическая опечатка с моей стороны. Я зафиксировал брекеты сейчас. – SalmaFG

ответ

2
var kiran = []; 
    var array1 = [{ key1: 'value1' }, { key1: 'value2' }]; 
    var array2 = [{ key2: 'value0' }, { key2: 'value2' }]; 
    array1.map(function(item1){ 
     array2.map(function(item2){ 
     if(item1.key1 === item2.key2){ 
      kiran.push(item2.key2); 
     } 
     }) 
    }) 
    console.log(kiran); 
+0

Это работает, спасибо! :) – SalmaFG

0

Вы можете использовать хеш-таблицу и с двоичным значением. Затем проверьте, равно ли счету три, и возьмите этот ключ в качестве результата.

var array1 = [{ key1: 'value1' }, { key1: 'value2' }], 
 
    array2 = [{ key2: 'value0' }, { key2: 'value2' }], 
 
    hash = Object.create(null), 
 
    incHash = function (i) { 
 
     return function (o) { 
 
      Object.keys(o).forEach(function (k) { 
 
       hash[o[k]] = (hash[o[k]] || 0) | 1 << i; 
 
      }); 
 
     }; 
 
    }, 
 
    result; 
 

 
[array1, array2].forEach(function (a, i) { 
 
    a.forEach(incHash(i)); 
 
}); 
 
result = Object.keys(hash).filter(function (k) { 
 
    return hash[k] === 3; 
 
}); 
 

 
console.log(result); 
 
console.log(hash);

0

Если вы можете использовать библиотеку третьей стороны, то я предлагаю Lodash. Невероятно полезная библиотека.

Вы можете использовать _.intersectionWith() Funciton, чтобы получить задание сделано в одной строке

 var array1 = [{ key1: 'value1' }, { key1: 'value2' }], 
 
      array2 = [{ key2: 'value0' }, { key2: 'value2' }]; 
 
     var intersection = _.map(_.intersectionWith(array1, array2, function(item1,item2){ 
 
      return item1.key1 === item2.key2; 
 
     }),'key1'); 
 
console.log(intersection);
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"> 
 

 
</script>

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