Фильтр массива не возвращается правильно для нуля? - PullRequest
0 голосов
/ 18 февраля 2020

function zeroCount(arr){       
   const zero = arr.filter(el=>{
            if(el===0){
                return el ;
            }
        });
    return zero.length ; // but it returns 0. I want it to return 3.
}

console.log(zeroCount([2,3,0,5,0,2,0]));

Я хочу вернуть нет. нуля, присутствующего в массиве с использованием фильтра.

Ответы [ 9 ]

2 голосов
/ 18 февраля 2020

Для фильтрации вам необходимо вернуть логическое значение, например истинное или ложное значение.

Лучший подход - это непосредственный подсчет нулевых значений.

function zeroCount(arr) {
    return arr.reduce((s, v) => s + !v, 0);
}

console.log(zeroCount([2, 3, 0, 5, 0, 2, 0]));
0 голосов
/ 18 февраля 2020

Приведенный ниже метод помогает возвратить количество ложных значений в массиве.

function zeroCount(arr){       
   return arr.filter(elem => !elem).length;
}

console.log(zeroCount([2,3,0,5,0,2,0]));
0 голосов
/ 18 февраля 2020

Обработчик функции filter должен возвращать логическое значение

При следующем подходе предполагается, что существуют только числа.

function zeroCount(arr) {
  return arr.filter(el => !el).length;
}

console.log(zeroCount([2, 3, 0, 5, 0, 2, 0]));

Предыдущий подход генерирует ненужный массив, поэтому, если вы хотите сосчитать, лучше использовать функцию reduce следующим образом:

function zeroCount(arr) {
  return arr.reduce((r, el) => r + !el, 0);
}

console.log(zeroCount([2, 3, 0, 5, 0, 2, 0]));
0 голосов
/ 18 февраля 2020

Вам необходимо понять, как работает фильтр.

функция фильтра будет выбирать или удалять элементы на основе вашего возврата true или false изнутри.

вы возвращаете el, равное 0. 0 в JS является ложным. вот почему ваш код не работает.

два возможных решения 1)

function zeroCount(arr){       
 const zero = arr.filter(el=>{
        if(el===0){
            return true ;
        }
    });
   return zero.length ; // but it returns 0. I want it to return 3.
 }

2)

function zeroCount(arr){       
  const zero = arr.filter(el=> !el);
  return zero.length ; // but it returns 0. I want it to return 3.
 }

3), чтобы показать

zeroCount = (arr) => arr.filter(el => !el).length
0 голосов
/ 18 февраля 2020

function zeroCount(arr){       
   const zero = arr.filter(el=> el === 0);
   return zero.length;
}

console.log(zeroCount([2,3,0,5,0,2,0]));
0 голосов
/ 18 февраля 2020

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

Неудачная часть здесь что вы возвращаете 0, что означает ложь.

function zeroCount(arr){       
   const zero = arr.filter(el=>{
            if(el===0){
                return el; // This returns 0 so it won't be added to the filtered array
            }
        });
    return zero.length ; // but it returns 0. I want it to return 3.
}

console.log(zeroCount([2,3,0,5,0,2,0]));


Это будет работать

function zeroCount(arr){       
   const zero = arr.filter(el=> el === 0); // if the element is 0 then el === 0 will resolve to true and the element will be added to the filer array
    return zero.length ; // returns 3
}

console.log(zeroCount([2,3,0,5,0,2,0]));
0 голосов
/ 18 февраля 2020

Фильтр добавит элемент, только если вы вернете «истинное» значение. В настоящее время вы возвращаете e1 с 0. (Это неверно).

Просто верните true.

function zeroCount(arr) {
  const zero = arr.filter(el => {
    if (el === 0) {
      return true;
    }
  });
  return zero.length; // but it returns 0. I want it to return 3.
}

console.log(zeroCount([2, 3, 0, 5, 0, 2, 0]));
0 голосов
/ 18 февраля 2020

filter функция обратного вызова должна возвращать логическое значение, а вы не обрабатываете ложный регистр

Ваша функция должна выглядеть следующим образом

function zeroCount(arr){       
  const zero = arr.filter(el=>{
     return el === 0;
  });

  return zero.length; // it returns 3
}

или использовать сокращение

function zeroCount(arr){       
  const zero = arr.filter(el=> el === 0);

  return zero.length; // it returns 3
}

0 голосов
/ 18 февраля 2020

Вы можете использовать логи c следующим образом:

[....].filter(x => x===0).length

Таким образом, ваш код будет

    function zeroCount(arr){       
      return arr.filter(x => x===0).length;
    }
    
    console.log(zeroCount([2,3,0,5,0,2,0]));

Метод filter () создает новый массив со всеми элементами, которые проходят тест, реализованный предоставленной функцией. и .length () получит длину этого массива здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...