Глиф Учебники

Как сравнить два массива

Справочник · JavaScript · 1 минута чтения

=== для массивов проверяет не содержимое, а то, один ли это массив. Содержимое сравнивают поэлементно:

JavaScript
const a = [1, 2, 3];
const b = [1, 2, 3];
const c = a;

console.log(a === b);
console.log(a === c);

function equalArrays(x, y) {
  return x.length === y.length && x.every((value, i) => value === y[i]);
}

console.log(equalArrays(a, b));
console.log(equalArrays(a, [3, 2, 1]));
Вывод
false
true
true
false

a и b — два разных массива с одинаковым содержимым, поэтому a === b — false. c — не копия, а второе имя того же массива, поэтому a === c — true.

Функция equalArrays сначала сравнивает длины, потом методом every проверяет, что каждый элемент совпадает с элементом второго массива под тем же индексом. Она подходит для массивов из чисел, строк и логических значений.

Быстрый способ: JSON.stringify

JavaScript
console.log(JSON.stringify([1, 2, 3]) === JSON.stringify([1, 2, 3]));
console.log(JSON.stringify([1, undefined]) === JSON.stringify([1, null]));
Вывод
true
true

Массивы превращаются в строки, а строки сравниваются по содержимому. Способ короткий и работает для вложенных массивов, но с ловушками: undefined и NaN в массиве становятся null (вторая строка — ложное «равны»), а у объектов внутри важен порядок ключей. Для простых данных годится, для точной проверки — нет.

Без учёта порядка

Если порядок неважен, сравнивают отсортированные копии:

JavaScript
function sameItems(x, y) {
  const sx = [...x].sort();
  const sy = [...y].sort();
  return sx.length === sy.length && sx.every((value, i) => value === sy[i]);
}

console.log(sameItems(["б", "а", "в"], ["в", "б", "а"]));
Вывод
true

Копии ([...x]) нужны потому, что sort меняет сам массив.

Вложенные массивы и объекты

В Node.js глубокое сравнение есть готовое — util.isDeepStrictEqual:

JavaScript
const util = require("node:util");

console.log(util.isDeepStrictEqual([1, [2, 3]], [1, [2, 3]]));
console.log(util.isDeepStrictEqual([{ id: 1 }], [{ id: 2 }]));
Вывод
true
false

В браузере такой функции нет: берут библиотеку (например, isEqual из lodash) или пишут рекурсивную функцию.

Чем массивы отличаются

Какие элементы есть в одном массиве и нет в другом:

JavaScript
const before = ["a", "b", "c"];
const after = ["b", "c", "d"];

console.log(after.filter((x) => !before.includes(x)));
console.log(before.filter((x) => !after.includes(x)));
Вывод
[ 'd' ]
[ 'a' ]

Первая строка — что добавилось, вторая — что пропало.