Задать вопрос
@WorlDIk

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

Есть два массива: [1, 3, 3, 4, 6, 5, 4] и [6, 3, 5, 2, 2].
Разницу этих массивов надо передать в новый массив, чтобы выглядело следующим образом: [1, 2, 4].
Я попробовал

function arr_diff (a1, a2) {

    var a = [], diff = [];

    for (var i = 0; i < a1.length; i++) {
        a[a1[i]] = true;
    }

    for (var i = 0; i < a2.length; i++) {
        if (a[a2[i]]) {
            delete a[a2[i]];
        } else {
            a[a2[i]] = true;
        }
    }

    for (var k in a) {
        diff.push(k);
    }

    return diff;
}

Но из-за того, что во втором массиве 2 повторяется, новый массив выглядит как [1,4].
  • Вопрос задан
  • 162 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
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
  ), []);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы