Почему метод фильтра не возвращает число 0 - PullRequest
2 голосов
/ 30 октября 2019

Когда я использую фильтр, число 0 не включается в новый массив:

function arrayDiff(a, b) {
   return a.filter(value => {
       if(!b.includes(value)){
        return value;
      }; 
   });
}

array_diff([1, 2, 0, 4, 2, 6, 4, 1, 4, 0] ,[2,5]);

Возвращаемое значение: [1, 4, 6, 4, 1, 4]. Посмотрите, как отсутствует 0.

Я также пытался вернуть только число 0, но был возвращен пустой массив.

Как я могу исправить .filter, чтобы включить 0 в результат успешно

1 Ответ

5 голосов
/ 30 октября 2019

0 - false, поэтому, если вы return value, если value - false, он не будет включен в результирующий массив. Вместо этого верните true или, что еще проще, просто верните !b.includes(value):

function array_diff(a, b) {
   return a.filter(value => !b.includes(value));
}

console.log(array_diff([1, 2, 0, 4, 2, 6, 4, 1, 4, 0] ,[2,5]));

(также обратите внимание, что вам нужно использовать одно и то же имя функции при объявлении функции и ее вызове - либо используйте array_diff для обоих, либо arrayDiff для обоих)

Вы можете уменьшить вычислительную сложность алгоритма с O(n ^ 2) до O(n), используя вместо этого Set, если хотите. Set.has равно O(1), тогда как Array.includes равно O(n):

function array_diff(a, b) {
  const set = new Set(b);
  return a.filter(value => !set.has(value));
}

console.log(array_diff([1, 2, 0, 4, 2, 6, 4, 1, 4, 0] ,[2,5]));
...