Нахождения симметрической разности между двумя массивами


В этом задании от freecodecamp, мне дали следующие МДН ресурсов:

1. ломтик()

2. фильтр()

3. метод indexOf()

4. функция concat()

Хотя да, я мог бы сделать это с помощью цикла for и другие методы, я застрял на то, что было дано мне, чтобы выяснить проблему. Интересно, если я мог бы сделать что-то лучше/эффективнее с мой код, используя ресурсы выше.

function diffArray(arr1, arr2) {
  var newArr = [];

  var concatArr = arr1.concat(arr2);

  return newArr = concatArr.filter(function(x) {

    if (arr1.indexOf(x) == -1 || arr2.indexOf(x) == -1) {
      return x;
    }
  });
}

console.log(diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]));



169
-4
задан 6 апреля 2018 в 05:04 Источник Поделиться
Комментарии
2 ответа

В newArr локальную переменную нужно объявить и инициализировать,
и это понятно:


return newArr = concatArr.filter(...);

Устранить newArr переменной, вы не нуждаетесь в нем.
И избежать присвоения значений в операторе return.


concatArr это пустая трата: он хранит содержимое обоих входных массивов,
только чтобы отфильтровать элементы позже.

Логика фильтрации тоже неэффективно: для каждого значения в массив объединяются,
он проверяет, если значение присутствует в обоих входных массивов. Но каждое значение присутствует хотя бы в одном из массивов, поэтому одной из проверок оценивается неоправданно.

Лучше бы реорганизовать операции:


  • Применить фильтр на первом массиве

  • Применить фильтр на второй массив

  • Объединить результаты из фильтров

Например:

function diffArray(arr1, arr2) {
const diff = (arr1, arr2) => arr1.filter(x => arr2.indexOf(x) === -1);
return diff(arr1, arr2).concat(diff(arr2, arr1));
}

1
ответ дан 18 декабря 2018 в 05:12 Источник Поделиться

Ваш код ломается, когда один из массивов содержит 0 элемент.

0
ответ дан 6 апреля 2018 в 06:04 Источник Поделиться