Вычислить пересечение двух массивов в JavaScript

Учитывая два массива неравной длины:

var arr1 = ["mike", "sue", "tom", "kathy", "henry"]; //arr1.length = 5
var arr2 = ["howey", "jim", "sue", "jennifer", "kathy", "hank", "alex"]; //arr2.length = 7

Как найти значения, общие для обоих массивов? В этом случае "sue" и "kathy" должны быть возвращены.

Ответ 1

Вот функция пересечения, основанная на Array.prototype.filter

function intersect(a, b) {
    var t;
    if (b.length > a.length) t = b, b = a, a = t; // indexOf to loop over shorter
    return a.filter(function (e) {
        return b.indexOf(e) > -1;
    });
}

var arr1 = ["mike", "sue", "tom", "kathy", "henry"];
    arr2 = ["howey", "jim", "sue", "jennifer", "kathy", "hank", "alex"];

intersect(arr1, arr2); // ["sue", "kathy"]

Вы также можете рассмотреть следующие

var arr1 = ['sue', 'sue', 'kathy'],
    arr2 = ['kathy', 'kathy', 'sue'];

Вышеуказанное теперь даст ["sue", "sue", "kathy"]. Если вы не хотите дубликатов, вы можете сделать еще один фильтр. Это также стандартизирует результаты. то есть.

return a
    .filter(/* .. */) // same as before
    .filter(function (e, i, c) { // extra step to remove duplicates
        return c.indexOf(e) === i;
    });

Добавление этого теперь вернет тот же результат, что и предыдущие массивы (["sue", "kathy"]), хотя были дубликаты.

Ответ 2

Вы можете использовать Array.filter:

var result = arr1.filter(function(n) {
  return arr2.indexOf(n) > -1;
});

Ответ 3

Вы хотите найти пересечение двух массивов?

Вы можете использовать Underscore intersection(). Это даст вам список значений, присутствующих в обоих массивах.

var commonValues = _.intersection(arr1, arr2);

jsFiddle.

Если вы не хотели использовать библиотеку, было бы тривиально реализовать...

var commonValues = arr1.filter(function(value) { 
                                   return arr2.indexOf(value) > -1;
                               });

jsFiddle.

Если Array.prototype.filter() и Array.prototype.indexOf() не поддерживаются на ваших целевых платформах...

var commonValues = [];
var i, j;
var arr1Length = arr1.length;
var arr2Length = arr2.length;

for (i = 0; i < arr1Length; i++) {
    for (j = 0; j < arr2Length; j++) {
        if (arr1[i] === arr2[j]) {
            commonValues.push(arr1[i]);
        }
    }
}

jsFiddle.

Ответ 4

Перейдите по одному из массивов и сравните объекты с другим:

var results = [];

for (var i = 0; i < arr1.length; i++) {
    if (arr2.indexOf(arr1[i]) !== -1) {
        results.push(arr1[i]);
    }
}