13

Как получить разницу между двумя массивами в JavaScript?

11

Как вернуть разницу между двумя массивами в JavaScript?

У меня есть два массива, например:

var a1 = ['a', 'b'];
var a2 = ['a', 'b', 'c', 'd'];

// мне нужен результат: ["c", "d"]

Кто может подсказать, как это реализовать?

5 ответ(ов)

9

Для того чтобы создать метод diff для массивов, который будет возвращать элементы первого массива, отсутствующие во втором, можно воспользоваться следующей реализацией:

Array.prototype.diff = function(a) {
    return this.filter(function(i) {
        return a.indexOf(i) < 0;
    });
};

Примеры использования:

const dif1 = [1, 2, 3, 4, 5, 6].diff([3, 4, 5]);
console.log(dif1); // => [1, 2, 6]

const dif2 = ["test1", "test2", "test3", "test4", "test5", "test6"].diff(["test1", "test2", "test3", "test4"]);
console.log(dif2); // => ["test5", "test6"]

Обратите внимание, что методы .indexOf() и .filter() доступны только начиная с Internet Explorer 9 и выше, поэтому если ваша целевая аудитория использует более старые версии браузеров, вам следует искать альтернативные подходы для фильтрации массивов.

3

Этот ответ был написан в 2009 году, поэтому он немного устарел, но он может быть полезен для понимания проблемы. На сегодняшний день лучшим решением будет использовать метод фильтрации массивов:

let difference = arr1.filter(x => !arr2.includes(x));

(благодарности другому автору за это решение)

Я предполагаю, что вы сравниваете обычные массивы. Если это не так, вам нужно изменить цикл for на цикл for ... in.

Вот пример функции для нахождения различий между двумя массивами:

function arr_diff(a1, a2) {
    var a = [], diff = [];

    for (var i = 0; i < a1.length; i++) {
        a[a1[i]] = true;
    }

    for (var i = 0; i < a2.length; i++) {
        if (a[a2[i]]) {
            delete a[a2[i]];
        } else {
            a[a2[i]] = true;
        }
    }

    for (var k in a) {
        diff.push(k);
    }

    return diff;
}

console.log(arr_diff(['a', 'b'], ['a', 'b', 'c', 'd'])); // []
console.log(arr_diff("abcd", "abcde")); // ["e"]
console.log(arr_diff("zxc", "zxc")); // []

Эта функция возвращает элементы, которые присутствуют в одном массиве, но отсутствуют в другом.

3

Это, безусловно, самый простой способ получить именно тот результат, который вам нужен, используя jQuery:

var diff = $(old_array).not(new_array).get();

Теперь переменная diff содержит элементы, которые были в old_array, но отсутствуют в new_array.

0

Чистый подход в ES6 выглядит следующим образом.

var a1 = ['a', 'b'];
var a2 = ['a', 'b', 'c', 'd'];

Разность множеств

a2.filter(d => !a1.includes(d)) // вернет ["c", "d"]

Пересечение

a2.filter(d => a1.includes(d)) // вернет ["a", "b"]

Совместное исключение (симметрическая разность)

[ ...a2.filter(d => !a1.includes(d)),
  ...a1.filter(d => !a2.includes(d)) ]

Этот код демонстрирует, как можно получить различные операции над массивами, используя функции высшего порядка и оператор расширения в ES6.

0

Функция diff(a1, a2) объединяет два массива и возвращает массив с уникальными значениями, которые встречаются только в одном из массивов. Вот как это работает:

  1. Мы используем concat() для объединения массивов a1 и a2.
  2. Затем применяем filter(), чтобы отфильтровать элементы.
  3. Внутри filter() проверяем, является ли индекс текущего элемента равным его последнему индексу с помощью indexOf(val) и lastIndexOf(val). Если они равны, значит, элемент уникален и встречается только один раз в объединённом массиве.

Таким образом, результатом выполнения функции будет массив, содержащий только элементы, которые есть либо в a1, либо в a2, но не в обоих одновременно.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь