Проблема с функцией обратного вызова JS? - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь создать функцию, которая принимает массив и функцию обратного вызова. Функция должна возвращать true, если все значения в массиве, переданные в обратный вызов, возвращают true, в противном случае возвращают false. Но я не уверен, что делаю неправильно

const every = function(arr, callback) {
   arr.forEach(function(element) {     
     if(!callback(element)) {       
       return false         
     }       
   })      
   return true  
};  

every([1, 2, 3, 4, 5], function(val) {
    return val < 2
});

ожидаемые результаты => ложь но я становлюсь правдой

Ответы [ 4 ]

0 голосов
/ 05 января 2019

Я бы порекомендовал использовать простой цикл for:

    const every = (arr, callback) => {
       for (let i = 0; i < arr.length; i++){
          if (callback(arr[i]) === false){
             return false;
       }
    }
       return true;
    };  

    console.log(every([1, 2, 3, 4, 5], function(val){return val < 2}));
0 голосов
/ 05 января 2019

Возвращение false из обратного вызова forEach также не приведет к возврату функции every. Вместо этого он просто продолжит итератор forEach.

Самым простым решением вашей проблемы будет цикл for...of, поскольку он позволяет использовать шаблон return, аналогичный вашему фрагменту:

const every = function(arr, callback) {

  for (const element of arr) {
    if (!callback(element)) {
      return false;
    }
  }

  return true;
};

console.log(every([1, 2, 3, 4, 5], function(val) {
  return val < 2;
}));

Примечание: При использовании конструкции цикла every возвращает рано . Метод forEach для массивов всегда выполняется до тех пор, пока не будут посещены все элементы массива, но цикл прерывается сразу после того, как один из элементов не прошел тест. Обычный цикл for даст вам такое же преимущество в производительности.

0 голосов
/ 05 января 2019
arr.forEach(function(element) {
    return false
})

Это внутренняя функция, возвращающая false, которые не влияют на внешнюю функцию (в этой ситуации) Вы должны создать новую переменную во внешней функции и вместо возврата false во внутренней функции, изменить переменную в конце просто вернуть переменную

const every = function(arr, callback) {
    let isEvery = true
    arr.forEach(function(element) {     
        if(!callback(element)) { // or just isEvery = isEvery && statement
            isEvery = false
         }       
     })      
    return isEvery
};  
0 голосов
/ 05 января 2019

Вы можете использовать для этого Reduce (). Если вы основываете свое сокращение на правде и результате обратного вызова, оно останется верным, пока обратный вызов верен. Если обратный вызов имеет значение false, проверка на truth в условном выражении закоротит логику, и обратный вызов больше не будет выполняться. Хотя он будет проходить через все элементы.

Он также возвращает true для пустого массива, который, кажется, соответствует вашему первоначальному логическому замыслу.

const every = function(arr, callback) {
  return arr.reduce(function(truth, element){
    return truth && callback(element);
  }, true);
};  

console.log(
  every([1, 2, 3, 4, 5], function(val){return val < 2})
);

console.log(
  every([], function(val){return val < 2})
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...