Уникализируем массивы; объединяем в один; перебираем, отмечая, встречался ли текущий элемент ранее - если элемент встречен впервые, будет
false
, повторно (т.е., представлен в более чем одном из исходных массивов) будет
true
; хватаем элементы, которые
false
:
const diff = (...arrs) => Array
.from(arrs
.flatMap(arr => [...new Set(arr)])
.reduce((acc, n) => acc.set(n, acc.has(n)), new Map))
.reduce((acc, n) => (n[1] || acc.push(n[0]), acc), []);
Или, собираем
Map
, где ключами будут элементы вложенных массивов, а значениями множества вложенных массивов, где присутствует данный элемент. Получаем те ключи, где размер множества равен единице:
const diff = (...arrs) => Array
.from(arrs.reduce((acc, arr) => (
arr.forEach(n => acc.set(n, acc.get(n) ?? new Set).get(n).add(arr)),
acc
), new Map))
.reduce((acc, n) => (n[1].size === 1 && acc.push(n[0]), acc), []);
Или, никаких
Map
и
Set
- проверяем, что элемент вложенного массива отсутствует во всех других вложенных массивах и в результирующем массиве:
const diff = (...arrs) =>
arrs.reduce((acc, arr) => (
arr.forEach(n =>
arrs.every(m => m === arr || !m.includes(n)) &&
!acc.includes(n) &&
acc.push(n)
),
acc
), []);