Dude1321
@Dude1321
Только учусь.

Как работает эта функция возвращающая элементы одного массива отсутствующие у другого?

Вот код:
function diffArray(arr1, arr2) {
  var diff = function(a, b) {
    return a.filter(function(value) { return b.indexOf(value) === -1; });
};
return diff(arr1, arr2).concat(diff(arr2, arr1));
}

diffArray([1, "calf", 3, "piglet"], [1, "calf", 3, 4]);
//Возвращает: ["piglet",4]

Я не понимаю как return b.indexOf(value) === -1; возвращает элемент который отсутствует в arr2, но присутствует в arr1.
Спасибо за ответ.
  • Вопрос задан
  • 348 просмотров
Решения вопроса 1
@holymotion
У вас есть функция diffArray, она вызывается с переданными в неё 2мя массивами, данная функция (diffArray) возвращает результат вызова вложенных функции diff (и конкатенация их результатов)

Во вложенной функции, мы вызываем метод filter, в пример выше filter возвращает новый массив из элементов прошедших проверку на вхождение подстрок. Метод indexOf для Array, ищет у указанного массива "b" указанное значение (value) массива "a", в случае "не нахождения" возвращается -1
Получается что мы проходимся по всем элементам массива a ища несовпадения в массиве b, результат этого прохождения - новый массив.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@nirvimel
Как она работает? - УЖАСНО! Потому что, не смотря на красивый вид, ее вычислительная сложность составляет O (m * n) ! И это неприемлемо для задачи, которая имеет простые решения с меньшей вычислительной сложностью.

function diff(a, b) {
    const b_set = new Set(b);
    return a.filter(x => !b_set.has(x));
}

console.log(diff([1, 2, 3, 4], [5, 4, 3, 2])); // result === [1]

Вот пример решения той же задачи за O (m + n) (изначально я тут ошибся с оценкой сложности, но в комментах мы вместе с Interface пришли к истине в этом вопросе).
Ответ написан
Ваш ответ на вопрос

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

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