Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

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

Короткий ответ

Оставьте элементы первого массива, которых нет во втором:

const all = ['a', 'b', 'c', 'd'];
const done = ['b', 'd'];
 
console.log(all.filter((item) => !done.includes(item)).join(', '));

Результат:

a, c

Только в одном из массивов

Симметричная разность — элементы, которые есть только в одном из двух массивов:

const a = [1, 2, 3];
const b = [2, 3, 4];
const diff = [...a.filter((x) => !b.includes(x)), ...b.filter((x) => !a.includes(x))];
 
console.log(diff.join(', '));

Результат:

1, 4

Методы Set

У множеств есть готовые методы difference() и symmetricDifference():

const a = new Set([1, 2, 3]);
const b = new Set([2, 3, 4]);
 
console.log([...a.difference(b)].join(', '));
console.log([...a.symmetricDifference(b)].join(', '));

Результат:

1
1, 4

Что добавилось и что удалилось

Сравнение старого и нового списка даёт оба изменения:

const before = ['anna', 'oleg', 'ivan'];
const after = ['anna', 'ivan', 'maria'];
 
console.log('added:', after.filter((x) => !before.includes(x)).join(', '));
console.log('removed:', before.filter((x) => !after.includes(x)).join(', '));

Результат:

added: maria
removed: oleg

Частая ошибка

Порядок аргументов важен: разность a и b — не то же самое, что разность b и a:

const a = [1, 2, 3];
const b = [2, 3, 4];
 
console.log(a.filter((x) => !b.includes(x)).join(), b.filter((x) => !a.includes(x)).join());

Результат:

1 4

Функции из этого ответа

  • Array.prototype.filter — Создаёт новый массив из элементов, прошедших проверку.
  • Array.prototype.includes — Проверяет, есть ли значение в массиве.
  • Set — Коллекция уникальных значений.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.