2016-05-03 3 views
1

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

function every(array, compare) { 
    var newArray = array.filter(
     function(property) { 
      return compare(property); 
     } 
    ); 

    if (newArray === undefined || newArray.length == 0) { 
     return false; 
    } 
} 


console.log(every([NaN, NaN, NaN], isNaN)); 
// → true 
console.log(every([NaN, NaN, 4], isNaN)); 
// → false 

, как вы можете видеть, я должен получить истинное и ложное, но вместо этого я получаю неопределенными и неопределенными. Почему это так? Я думаю, это потому, что я не понимаю isNaN правильно, но я не уверен на 100%.

+2

Что происходит, если 'if' не работает? Функция возвращает 'undefined' по умолчанию ... – elclanrs

+3

' Я должен получить true и false' - когда ваша функция возвращает 'true'? – Adam

+2

Обратите внимание, что 'return' внутри' filter' не возвращается из функции 'every', он просто определяет результат фильтра (для одного элемента массива). – Thilo

ответ

1

isNaN return true, когда аргумент NaN, это означает, что функция фильтра сохраняет NaN, но удаляет все остальное. Его длина равна 0, если в массиве не было NaN. Для такого массива ваша функция возвращает false:

console.log(every([4], isNaN)); // false 

Это похоже на то, что вы хотите. Вы вызвали свою функцию every, но она больше похожа на то, что ее следует называть some.

Для всего остального он возвращает undefined (вместо true), потому что у вас нет оператора возврата в любом другом случае. Ваш единственный оператор возврата находится внутри оператора if, поэтому, если условие не является правдивым, оно возвращает undefined. Один из способов исправить это изменить его так, что он возвращает результат сравнения newArray.length === array.length:

function every (array, compare){ 
    var newArray = array.filter(
     function (property){ 
      return compare(property); 
     } 
    ); 

    return newArray.length === array.length; 

} 


console.log(every([NaN, NaN, NaN], isNaN)); 
// → true 
console.log(every([NaN, NaN, 4], isNaN)); 
// → false 

Альтернативой отрицать возвращаемое значение compare внутри фильтра обратного вызова (см @ ответ Shomz), и затем return newArray.length === 0; ,

+0

Не видел вашего ответа, когда начал писать. Это все, что нужно. – Shomz

2
if (newArray === undefined || newArray.length == 0) 
    return false; 

Это активируется, только если ваш новый массив пуст или не определен. В противном случае функция возвращает undefined. Исправьте это, а также отмените возврат функции обратного вызова, потому что isNaN истинно, когда значение не является числом.

Смотрите здесь:

function every(array, compare) { 
 
    var newArray = array.filter(
 
    function(property) { 
 
     return !compare(property); 
 
    } 
 
); 
 
    return newArray.length == 0; 
 
} 
 

 

 
console.log(every([NaN, NaN, NaN], isNaN)); 
 
// → true 
 
console.log(every([NaN, NaN, 4], isNaN)); 
 
// → false

+0

Обратите внимание, что 'newArray === undefined' невозможно, поскольку [Array.prototype.filter] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) никогда не возвращает 'undefined'. Условие может быть просто сокращено до 'newArray.length === 0'. – Paulpro

+0

@Paulpro, это правда, спасибо. В принципе, OP просто нужно изменить оператор return. Я уточню свой ответ. – Shomz

+0

спасибо! высоко оценил –

Смежные вопросы