Как получить разницу между двумя массивами в JavaScript?
Как вернуть разницу между двумя массивами в JavaScript?
У меня есть два массива, например:
var a1 = ['a', 'b'];
var a2 = ['a', 'b', 'c', 'd'];
// мне нужен результат: ["c", "d"]
Кто может подсказать, как это реализовать?
5 ответ(ов)
Для того чтобы создать метод 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 и выше, поэтому если ваша целевая аудитория использует более старые версии браузеров, вам следует искать альтернативные подходы для фильтрации массивов.
Этот ответ был написан в 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")); // []
Эта функция возвращает элементы, которые присутствуют в одном массиве, но отсутствуют в другом.
Это, безусловно, самый простой способ получить именно тот результат, который вам нужен, используя jQuery:
var diff = $(old_array).not(new_array).get();
Теперь переменная diff
содержит элементы, которые были в old_array
, но отсутствуют в new_array
.
Чистый подход в 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.
Функция diff(a1, a2)
объединяет два массива и возвращает массив с уникальными значениями, которые встречаются только в одном из массивов. Вот как это работает:
- Мы используем
concat()
для объединения массивовa1
иa2
. - Затем применяем
filter()
, чтобы отфильтровать элементы. - Внутри
filter()
проверяем, является ли индекс текущего элемента равным его последнему индексу с помощьюindexOf(val)
иlastIndexOf(val)
. Если они равны, значит, элемент уникален и встречается только один раз в объединённом массиве.
Таким образом, результатом выполнения функции будет массив, содержащий только элементы, которые есть либо в a1
, либо в a2
, но не в обоих одновременно.
Как перемешать (сделать случайным) массив в JavaScript?
Как объединить два массива в JavaScript и удалить дубликаты?
Как очистить массив в JavaScript?
Как получить доступ к вложенным объектам, массивам или JSON и обработать их?
Как удалить все дубликаты из массива объектов?