Задать вопрос
  • Как найти элементы, встречающиеся только в одном из двух массивов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Уникализируем массивы; объединяем в один; перебираем, отмечая, встречался ли текущий элемент ранее - если элемент встречен впервые, будет 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
      ), []);
    Ответ написан
    1 комментарий