Сравнение массивов в JavaScript

Часто разработчики сталкиваются с необходимостью сравнить два массива в JavaScript. Например, можно иметь два массива чисел и нужно узнать, содержат ли они одинаковые числа в одинаковом порядке. Интуитивно кажется, что для этого достаточно использовать оператор сравнения == или === . Однако, если попробовать сделать это, то результат может быть неожиданным.
var array1 = [1, 2, 3]; var array2 = [1, 2, 3]; console.log(array1 == array2); // Выводит false console.log(array1 === array2); // Выводит false
Причина этого в том, что операторы == и === сравнивают ссылки на объекты, а не их содержимое. В данном случае array1 и array2 — это разные объекты, хотя их содержимое одинаково.
Один из способов сравнить содержимое массивов — преобразовать их в строки с помощью метода JSON.stringify и сравнить полученные строки.
var array1 = [1, 2, 3]; var array2 = [1, 2, 3]; console.log(JSON.stringify(array1) == JSON.stringify(array2)); // Выводит true
Этот способ работает, но он может быть неэффективным для больших массивов, поскольку JSON.stringify преобразует весь массив в строку.
Более эффективным способом может быть использование цикла для проверки каждого элемента массива. Такой подход требует больше кода, но он работает быстрее для больших массивов и обеспечивает большую гибкость, так как можно управлять тем, как происходит сравнение элементов.
function arraysAreEqual(a, b) < if (a.length != b.length) return false; for (var i = 0; i < a.length; i++) < if (a[i] != b[i]) return false; >return true; > var array1 = [1, 2, 3]; var array2 = [1, 2, 3]; console.log(arraysAreEqual(array1, array2)); // Выводит true
В этом коде функция arraysAreEqual сначала проверяет, равны ли длины массивов. Если они не равны, то массивы точно не одинаковы, и функция возвращает false . Затем функция проходит по каждому элементу массива и сравнивает его с соответствующим элементом другого массива. Если она находит пару несовпадающих элементов, то она возвращает false . Если функция проходит через все элементы и не находит несовпадений, то она возвращает true , указывая на то, что массивы одинаковы.
Как сравнить два массива в js?
Есть допустим 2 массива.
Одинаковые по содержимому, только в одном на один элемент больше.
Как их сравнить, что бы вытащить элемент которого не хватает во втором массиве?
Заранее спасибо.
- Вопрос задан более трёх лет назад
- 101324 просмотра
Комментировать
Решения вопроса 2
Stalker_RED @Stalker_RED
Обновил ответ, старая реализация была с багом.
function diff(a1, a2) < return a1.filter(i=>a2.indexOf(i)<0) .concat(a2.filter(i=>a1.indexOf(i) <0)) >function compare(a1, a2) < return a1.length == a2.length && a1.every((v,i)=>v === a2[i]) >
upd: в ES7 (2016) появился метод includes
const diff = function(a1, a2) < return a1.filter(i=>!a2.includes(i)) .concat(a2.filter(i=>!a1.includes(i))) >
Ответ написан более трёх лет назад
Нравится 9 2 комментария


Понимаю, что уже не актуально, но, это решение не поможет вернуть разницу, если элементы повторяются (по значению), ну например
a1 = [1,1,1,1] a2 = [1,1,1]

JavaScript developer. IonDen.com
Например вот так на lodash:
jsfiddle.net/IonDen/pgt8xdgw
var a = [1, 2, 3, 4, 5], b = [1, 2, 3, 4, 5, 6]; function diff (a, b) < if (a.length >b.length) < return _.difference(a, b); >else < return _.difference(b, a); >> console.log(_.difference(b, a)); // [6]
Ответ написан более трёх лет назад
Нравится 5 2 комментария

Я и не знал про такие возможнсти js)) Только вы забыли вывести саму функцию diff(b, a), вместо этого выводите сразу обработчик разницы без сравнения, какой массив больше

А, все нормлано, это не возможности js. Не заметил, что это доп библиотека.
Ответы на вопрос 2
Антон Шаманов @SilenceOfWinter
та еще зажигалка.
Как вариант можно сериализовать и сравнить строки банальным ==
Ответ написан более трёх лет назад
Комментировать
Нравится 2 Комментировать
электрик,усусь на front
Я только начинаю учить. Для меня более понятный такой формат кода. Может кому то поможет. Добавил сортировку от меньшего к большему и наоборот.
var a1 = [1,2,3,99,88,77,89,-99,-199] a2 = [1,2,3,8,89,9,-99,6,-77] function sortMyArray(a,b) < return b - a; >function sortMyArrayR(a,b) < return a - b; >function comparison () < return a1.filter(i=>a2.indexOf(i)<0).concat(a2.filter(i=>a1.indexOf(i) <0)) >write.innerHTML += "["+comparison(a1,a2).sort(sortMyArray)+"]"; arr.innerHTML += "["+ a1.sort(sortMyArray).toString()+"] \t["+a2.toString()+"]" writeRev.innerHTML += "["+comparison(a1,a2).sort(sortMyArrayR)+"]";
compare:
compareReverse:
Сравнение массивов
Однако, такой подход может быть не очень надежным, например:
var arr1 = [4, "a":1, "b":2>] ; var arr2 = [4, "b":2, "a":1>] ; // изменен порядок в объекте console.log( JSON.stringify(arr1) === JSON.stringify(arr2) ); // false
С помощью цикла for
function equalArrays(a,b) < if (a.length != b.length) return false; // Массивы разной длины не равны for(var i = 0; i < a.length; i++) // Цикл по всем элементам if (a[i] !== b[i]) return false; // Если хоть один элемент отличается, массивы не равны return true; // Иначе они равны >
Сравнение двух массивов с объектами
Вопрос, массивы отсортированы, и id у них числовые? Можно ли строить алгоритм на том, что id — это 1,2,3 и т.д. Или же они могуть быть разнообразные? В зависимости от ответа, могут быть разные алгоритмы по производительности
13 окт 2021 в 8:14
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Тяжело представить вычисление пересечения массива без переобходов. Единственное, что могу предложить — сократить количество операций.
Для начала, стоит определить самый маленький массив, так как результирующий массив не будет больше самого маленького, но позволит сократить количество обходов для ряда значений, которые есть в большем, но отсутствуют в меньшем массиве. Это позволит убрать push и использовать filter.
Вторым этапом, нам нет нужды во втором массива обходить его весь, как у вас. Достаточно первого совпадения, в этом нам поможет some. Таким образом мы гарантированно обойдем оба массива только когда нет ни одного соответствия. В случае с совпадением, мы выйдем при первом же совпадении.
const arr1 = [ < id: 1 >, < id: 2 >, < id: 3 >, < id: 4 >] const arr2 = [ < id: 1 >, < id: 4 >, < id: 5 >, ] const leastArr = arr1.length < arr2.length ? arr1 : arr2; const biggestArr = arr1.length >= arr2.length ? arr1 : arr2; const resultArray = leastArr.filter((item) => < return biggestArr.some((item2) =>item2.id === item.id) >); console.log(resultArray);