2016-05-03 15 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

'私は真と偽になるはずです ' - あなたの関数はいつ真を返しますか? – Adam

+2

'filter'内部の' return'は 'every'関数から戻ってこないことに注意してください。ただ一つの配列要素のフィルタ結果を決定するだけです。 – Thilo

答えて

1

isNaN return引数がNaNの場合、フィルタ関数はNaNを保持しますが、それ以外はすべて削除します。配列内にNaNがない場合、その長さは0になります。そのような配列の場合、関数はfalseを返します。

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

これはあなたが望むものとは逆のようです。あなたはあなたの関数をeveryと呼んでいましたが、それはsomeと呼ばれるべきです。

他のケースではreturn文を使用しないため、それ以外の場合はundefinedtrueではなく)が返されます。唯一のreturnステートメントはifステートメント内にあるため、条件がtrueyでない場合はundefinedを返します。

代替は、あなたのフィルタコールバック内 compareの戻り値を否定することである ​​

(Shomzの答え@参照)、その後、return newArray.length === 0;:それを修正する一つの方法は、それが比較newArray.length === array.lengthの結果を返すように、それを変更することです。

+0

私が私の執筆を始めたときに答えが見えませんでした。これがすべて必要です。 – Shomz

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

これは、新しい配列が空または未定義の場合にのみトリガーされます。それ以外の場合は、関数はundefinedを返します。値が数値でない場合はisNaNがtrueであるため、それを修正してコールバック関数の戻りを取り消してください。

はこちらをご覧ください:

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

[Array.prototype.filter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)から 'newArray === undefined'を実行することはできません。 )は 'undefined'を返しません。条件は 'newArray.length === 0'に短縮することもできます。 – Paulpro

+0

@Paulpro、それは本当です、ありがとうございます。基本的に、OPはreturn文を変更するだけです。私は私の答えを更新します。 – Shomz

+0

ありがとう!大いに感謝します –

関連する問題