array.filter () удаляет <falsey>значений в выражении функции, но не в функции стрелки - PullRequest
0 голосов
/ 28 января 2020

Я решаю проблему, когда функция array_diff возвращает значения в массиве a, которые также находятся в массиве b.

Так как я узнал, что выражения для именованных функций лучше для Отладка консоли, чем анонимные функции жирной стрелки 0 из моего возвращенного массива.

Выражение именованной функции:

function array_diff(a, b) {
  return a.filter(function removeDuplicate(x) { if(b.indexOf(x) == -1) return x; });
}

array_diff([0,1,2,3,4],[2,4]); // [1, 3]

Функция Anonymous Fat Arrow:

function array_diffTwo(a, b) {
  return a.filter((x) => { return b.indexOf(x) == -1 });
}

array_diffTwo([0,1,2,3,4],[2,4]); // [0, 1, 3]

Может кто-нибудь объяснить мне, почему значение Falsey 0 равно удалено в array_diff, а не array_diffTwo?

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Проблема в том, что вы return x из фильтра обратного вызова. Если x (элемент, который повторяется) равен false, результат не будет включен в окончательный массив, , даже если тест b.indexOf(x) == -1 выполнен.

Выполните То же самое вы делаете с нижним кодом:

return b.indexOf(x) == -1

function array_diff(a, b) {
  return a.filter(function removeDuplicate(x) { return b.indexOf(x) === -1 });
}

console.log(array_diff([0,1,2,3,4],[2,4])); // [0, 1, 3]

(в качестве примечания: нигде в коде не используются функции стрелок)

Вы можете уменьшить вычислительную сложность с O(n ^ 2) до O(n) путем создания набора b вместо проверки indexOf s на нем на каждой итерации:

function array_diff(a, b) {
  const bSet = new Set(b);
  return a.filter(function removeDuplicate(x) { return !bSet.has(x); });
}

console.log(array_diff([0,1,2,3,4],[2,4])); // [0, 1, 3]
0 голосов
/ 28 января 2020

вы неправильно поняли array.filter (callback). callback должен быть предикатом, в обратном вызове вы возвращаете true для элементов, которые вы хотите сохранить, false для элементов, not the element. Когда вы возвращаете сами элементы, вот почему элементы Falsey удаляются.

также, функция стрелки должна выглядеть примерно так:

array_diff =(a,b)=>a.filter(x=>b.indexOf(x)<0)
console.log(array_diff([0,1,2,3,4],[2,4]))
...