2016-05-03 28 views
1

Ich mache gerade eine Übung, und ich kann nicht herausfinden, warum dies undefiniert zurückkehrt.Warum gibt diese Funktion undefiniert zurück?

Wie Sie sehen können, soll ich wahr und falsch werden, aber stattdessen werde ich undefiniert und undefiniert. Warum ist das der Fall? Ich denke es liegt daran, dass ich IsNaN nicht richtig verstehe, aber ich bin mir nicht 100% sicher.

+2

Was passiert, wenn die 'if' läuft nicht? Eine Funktion gibt 'undefined' standardmäßig zurück ... – elclanrs

+3

'Ich soll wahr und falsch werden '- wann kehrt deine Funktion' wahr 'zurück? – Adam

+2

Beachten Sie, dass das 'return' innerhalb des' filters' nicht von der 'every'-Funktion zurückkommt, es bestimmt nur das Filterergebnis (für ein einzelnes Array-Element). – Thilo

Antwort

1

isNaN zurück wahr, wenn es Argument ist NaN, das bedeutet, dass Ihre Filterfunktion NaN hält, aber alles andere entfernt. Seine Länge ist nur 0, wenn das Array keine NaNs enthielt. Für solch ein Array gibt Ihre Funktion false zurück:

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

Das scheint das Gegenteil von dem zu sein, was Sie wollen. Sie haben Ihre Funktion every aufgerufen, aber es verhält sich eher so, als sollte es some heißen.

Für alles andere gibt es undefined (statt true) zurück, weil Sie in keinem anderen Fall eine Rückgabeanweisung haben. Ihre einzige return-Anweisung befindet sich in der if-Anweisung. Wenn die Bedingung nicht truthy ist, wird undefined zurückgegeben. Ein Weg, um es zu beheben ist, es zu ändern, so dass sie das Ergebnis des Vergleichs gibt 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 

Die Alternative ist, den Rückgabewert von compare in Ihrem Filter Rückruf zu negieren (siehe @ Shomz Antwort) und dann return newArray.length === 0; .

+0

Ich habe deine Antwort nicht gesehen, als ich angefangen habe, mir zu schreiben. Das ist alles was benötigt wird. – Shomz

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

Dies wird nur ausgelöst, wenn Ihr neues Array leer oder undefiniert ist. Andernfalls gibt die Funktion undefined zurück. Korrigieren Sie das und kehren Sie auch die Rückgabe Ihrer Callback-Funktion um, weil isNaN wahr ist, wenn ein Wert keine Zahl ist.

Siehe hier:

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

Beachten Sie, dass 'newArray === undefined' nicht möglich ist, da [Array.prototype.filter] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) gibt niemals 'undefined' zurück. Die Bedingung kann auch einfach auf 'newArray.length === 0' verkürzt werden. – Paulpro

+0

@Paulpro, das stimmt, danke. Grundsätzlich muss OP nur die Return-Anweisung ändern. Ich werde meine Antwort aktualisieren. – Shomz

+0

danke! sehr geschätzt –

Verwandte Themen