2016-12-03 2 views
1
function bouncer(arr) { 
    var array = [false, null, 0, NaN, undefined, ""]; 
    var result = []; 
    for (var i = 0; i < arr.length; i++) { 
     if (array.indexOf(arr[i]) === -1) { 
      result.push(arr[i]); 
     } 
    } 
    return result; 
} 
ex : bouncer([7, "ate", "", false, 9]) should return [7, "ate", 9]. 

Hallo allerseits, Ich versuche, all fälschlicherweise Werte zu löschen, die in dem Array eingegeben werden, aber für irgendwie, wenn ich bouncer([false,null, 0, NaN, undefined, ""]); betreiben ich [NaN] als Rückgabewert bekommen, während ich ein leeres Array erwarten. Weiß jemand, warum die Funktion die falschen Werte zurückgibt?Wie gibt die indexOf-Methode den falschen Wert zurück?

+2

'NaN' sich nicht gleich ist. – tkausl

+0

Dies ist eine doppelte Frage: http://stackoverflow.com/questions/32906887/remove-all-falsy-values-from-an-array – HenryDev

+0

Eigentlich 'if (!! arr [i])' sogar für NaN arbeitet –

Antwort

0

Wie bereits erwähnt - NaN ist (mit Absicht) nicht gleich alles (nicht einmal selbst).

Ihr Problem lösen Sie die arr[i] === arr[i] zu Ihrem if(...) hinzufügen:

function bouncer(arr) { 
 
    var array = [false, null, 0, undefined, ""]; 
 
    var result = []; 
 
    for (var i = 0; i < arr.length; i++) { 
 
     if (array.indexOf(arr[i]) === -1 && (arr[i] === arr[i])) { 
 
      result.push(arr[i]); 
 
     } 
 
    } 
 
    return result; 
 
} 
 
console.log(bouncer([7, "ate", "", false, 9])); 
 
console.log(bouncer([false,null, 0, NaN, undefined, ""]));

5

Es ist, weil NaN ist wirklich ein Konzept eher als eine konkrete Zahl.

Betrachten Sie die beiden "Nummern" 0/0 und sqrt(-1). Keine davon ist im reellen Zahlenraum definiert, also geben beide NaN, aber sie sind eindeutig unterschiedliche Werte.

Da NaN grundsätzlich einen unbekannten Wert angibt, der in IEEE-754 nicht dargestellt werden konnte, wird er niemals als gleichwertig mit einem anderen NaN, angesehen.

Dies ist das Richtige zu tun, denn die Unendlichkeit gegeben (buchstäblich) von Zahlen, die keine reale Darstellung in IEEE-754 haben, sind die Chancen von zwei von ihnen die gleiche Zahl ist verschwindend klein sind :-)

ist zu

define isNaN(n): 
    return n != n 

um tatsächlich lösen dieses Problem, einen Weg wieder:

In der Tat, viele Implementierungen von isNaN() hängen von dieser Funktion, nämlich (Pseudo-Code) Bewegen Sie den NaN aus dem Überprüfungsfeld und ändern leicht die bedingte:

var array = [false, null, 0, undefined, ""]; 
: 
if ((array.indexOf(arr[i]) === -1) && (! isNaN(arr[i])) { 
0

Es gibt bereits eine Antwort, die erklärt, warum NaN im Ergebnis enthalten ist. In Bezug auf eine Lösung für Ihr Problem ist folgendes genügen:

function bouncer(arr) { 
    return Array.isArray(arr) ? arr.filter(v => v) : undefined; 
} 

Die Idee dabei ist, dass wir die Werte herauszufiltern, die zu true in einem Booleschen Kontext zwingen. Daher gibt die Funktion, die wir zum Filtern verwenden, nur den Wert selbst zurück!

Verwandte Themen