Как сравнить два массива
=== для массивов проверяет не содержимое, а то, один ли это массив. Содержимое сравнивают поэлементно:
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
falsea и b — два разных массива с одинаковым содержимым, поэтому a === b — false. c — не копия, а второе имя того же массива, поэтому a === c — true.
Функция equalArrays сначала сравнивает длины, потом методом every проверяет, что каждый элемент совпадает с элементом второго массива под тем же индексом. Она подходит для массивов из чисел, строк и логических значений.
Быстрый способ: JSON.stringify
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 (вторая строка — ложное «равны»), а у объектов внутри важен порядок ключей. Для простых данных годится, для точной проверки — нет.
Без учёта порядка
Если порядок неважен, сравнивают отсортированные копии:
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:
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) или пишут рекурсивную функцию.
Чем массивы отличаются
Какие элементы есть в одном массиве и нет в другом:
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' ]Первая строка — что добавилось, вторая — что пропало.