wake-up-neo.net

Wie filtere ich NaN, null, 0, false in einem Array (JS)?

Ich wurde gebeten, NaN, Null, 0, False in einem Array herauszufiltern.

Zum Glück habe ich die Frage beantwortet. 

function bouncer(arr) {
  function filterer(arr) {
     return arr > 0|| isNaN(arr) === true;
  }
  arr = arr.filter(filterer);
  return arr;
}

//example input
bouncer([0, 1, 2, 3, 'ate', '', false]); //output [1, 2, 3, 'ate']

aber ich weiß wirklich nicht, wie ich die Antwort gefunden habe, oder ich weiß nicht, wie es funktioniert. Speziell bei arr> 0 woher wusste der Filter, dass arr bereits auf arr [1], arr [2] usw. ist, ohne eine Schleife zu verwenden, um in allen Arrays zu iterieren.

oder kann einfach nur erklären, wie Code funktioniert. [Ich habe versucht, es klar zu erklären ---]

8
Fhrey

Schauen Sie sich die docs für Array.filter. Beachten Sie insbesondere die Argumente zum Rückruf:

Funktion zum Testen der einzelnen Elemente des Arrays. Wird mit Argumenten aufgerufen (Element, Index, Array). Geben Sie true zurück, um das Element beizubehalten, andernfalls false.

In deinem Fall ist arr das Element (und der Name ist schlecht, daher deine Verwirrung). Filter durchläuft Ihr Array und für jedes Element, das es aufruft, übergeben Sie den Rückruf an das Element an der aktuellen Position als arr.

Wie andere in den Kommentaren darauf hingewiesen haben, ist die Logik Ihres Filterrückrufs für negative Werte tatsächlich fehlerhaft. Dies ist jedoch möglicherweise kein Problem, wenn Sie wissen, dass Ihr Array niemals negative Werte enthält (dies kann jedoch eine gefährliche Annahme sein) ).

Und natürlich durchläuft dies intern Ihr Array. Sie können Ihr (unsortiertes) Array nicht filtern, ohne jedes Element im Array zu berühren. Schauen Sie sich die Polydatei im Link an, um eine Vorstellung davon zu bekommen, wie sie funktionieren könnte (möglicherweise, weil dies ein Implementierungsdetail ist, das bei verschiedenen Javascript-Engines unterschiedlich sein kann). Aber es wird zweifellos irgendwo eine Schleife enthalten. Sie durchläuft Ihr Array, ruft den Rückruf auf (beachten Sie die Argumente), und wenn der Rückruf true zurückgibt, wird er auf ein Ergebnisarray übertragen.

4
Matt Burland

Wenn Sie gebeten wurden, NaN, null, 0, false in einem Array herauszufiltern, funktionieren Ihre Lösungen nicht wirklich.

Ihre Eingabe von:

bouncer([0, 1, 2, 3, 'ate', '', false, NaN]);

Wird die Ausgabe von erhalten:

[1, 2, 3, 'ate', NaN]

Um alle 'falschen' Werte herauszufiltern, können Sie einfach Boolean verwenden:

function bouncer(arr) {
  return arr.filter(Boolean);
}

bouncer([0, 1, 2, 3, 'ate', '', false, NaN]);

Ausgabe:

[1, 2, 3, 'ate']

Da der Konstruktor Boolean auch eine Funktion ist, gibt er entweder das Argument true für 'wahrheit' oder false für das Argument 'falsy' zurück. Wenn der Wert nicht angegeben wird oder 0, -0, null, false, NaN, undefined oder die leere Zeichenfolge ("") lautet, hat das Objekt den Wert false. Alle anderen Werte, einschließlich aller Objekte oder der Zeichenfolge "false", erstellen ein Objekt mit dem Anfangswert true.

71
Bluefin

Sie können auch eine Identitätsfunktion anstelle von Boolean verwenden.

function bouncer(arr) {
  return arr.filter(x => x);
}
6
Trevor Dixon

Ich arbeite auch am Free Code Camp Falsy Bouncer-Algorithmus. Ich habe den einfachsten Weg gefunden, es zu tun:

function bouncer(arr) {
   return arr.filter(Boolean);
}
4
elimcjah

Die filter () - Methode erstellt ein neues Array mit allen Elementen, die den von der bereitgestellten Funktion implementierten Test bestehen.

Da false, null, 0, "", undefined und NaN in JavaScript alle Falsy - Werte sind, geben sie beim Test false zurück.

function bouncer(arr) {
  var array = arr.filter(function(val){
    return val;
  });
  return array;
}

Nur Werte, die nicht false zurückgeben, werden zum array hinzugefügt.

2
Ravi Kumar Seth

Wäre es nicht eleganter, anzunehmen, dass alle unerwünschten Elemente auf false gesetzt werden, wenn Boolean erwartet wird, so gilt Folgendes:

function clear (arr){
   var stripped = [];
   for (i = 0, len = arr.length; i < len; i++){
      if (arr[i])
         stripped.Push(arr[i]);
   }
   return stripped;
}
1
adam bahdaj

Da ich ein Anfänger oder Codierer bin, benutzte ich meine Logik, um primitive Boolean-Werte zu verwenden, um die -Filter des Artikels zu vergleichen. Dies war jedoch, bevor ich die Boolean-Objektreferenz gelesen habe. Sie sehen also, dass dort, "Der als erster Parameter übergebene Wert wird bei Bedarf in einen booleschen Wert konvertiert. Wenn der Wert weggelassen wird oder 0, -0, null, false, NaN, undefined oder der leere String (" ") ist, Das Objekt hat den Anfangswert "false". Alle anderen Werte, einschließlich aller Objekte oder die Zeichenfolge "false", erstellen ein Objekt mit dem Anfangswert "true". " Daher gibt der Logic-Filter den Wert zurück, wenn er wahr ist oder false, sollten Sie Werte zurückgeben, wenn true sind . Außerdem habe ich nicht alles über die Filtermethode gelernt. Für das, was ich recherchiert habe, habe ich etwas mehr Informationen Ich werde versuchen, es hier zu erklären

die Methode wird neu definiert (sie existiert bereits, dient nur dem Verständnis) Die Filtermethode akzeptiert eine Funktion mit dem Namen ein Prädikat. Dies ist eine Funktion, die einen Wert empfängt und true oder false zurückgibt.

Die var-Ergebnisse sind ein leeres Array, in das die Ergebnisse mit der Push-Methode ..__ gepusht werden. Wir verwenden eine forEach-Methode (dies wird in diesem Zusammenhang auf den Array-Prototyp angewendet, das heißt, Sie haben die Filtermethode, die für jedes von Ihnen definierte Array verfügbar ist, mit dem sintax von array.method (args) in diesem Fall array.filter (args)) einige Ressourcen https: //developer.mozilla .org/de-de/docs/Web/JavaScript/Referenz/Globale_Objekte/Objekt/Prototyp

Jetzt führen wir in jedem Element des Arrays eine Operation mit der forEach-Methode aus. Jetzt wenden wir die Prädikatsfunktion auf das itch-Element des Arrays an. Wenn es true zurückgibt, wird es den Ergebnissen hinzugefügt.

Array.prototype.filter = function(predicate){   
    var results = [];

    this.forEach(function(item) {   
        if (predicate(item)) {
            results.Push(item);
        }

    });
};

// ------------------------------- Richtige Lösung --------------- ------------

function bouncer (arrToFilter){

    return arrToFilter.filter(Boolean);
}

// ---------- Code ohne die Filtermethode ---------

function bouncerNoFilterMethod(arrToFilter){
    var results = [];

    arrToFilter.forEach(function(arrToFilter){
        if(arrToFilter){
            results.Push(arrToFilter);
        }
    });

    return  results;    
}

console.log(bouncerNoFilterMethod([7, "ate", "", false, 9]));
console.log(bouncerNoFilterMethod(["a", "b", "c"]));
console.log(bouncerNoFilterMethod([false, null, 0, NaN, undefined, ""]));
console.log(bouncerNoFilterMethod([1, null, NaN, 2, undefined]));
console.log(bouncer([7, "ate", "", false, 9]));
console.log(bouncer(["a", "b", "c"]));
console.log(bouncer([false, null, 0, NaN, undefined, ""]));
console.log(bouncer([1, null, NaN, 2, undefined]));

Ich hoffe, das hilft, die Methode zu verstehen, und das erste, was nicht verstanden wurde, war der Teil des Passierens der Funktion, des Prädikats der Methode. Wenn ich hier Fehler habe, schlagen Sie bitte Korrekturen vor.

Sieht so aus, als wäre Boolean die einfachste Lösung für die Herausforderung "FreeCodeCamp". Es kann jedoch nützlich sein, ein paar Dinge zu versuchen, nur um "Warum" und "Wie" zu verstehen.

function bouncer(arr) {
      return arr.filter(function(val){
        return val;
     });
    }

Dies wertet alles aus, was den Filter passiert, unter Verwendung der übergebenen Funktion (Callback), die Werte zurückgibt. Wenn es keinen Wert zurückgibt, den Null usw. nicht, wird er nicht in die Rückgabe einbezogen. Zumindest half mir diese Methode zu verstehen, warum man den Test nicht bestanden hat.

0
Holden

Funktion zum Testen der einzelnen Elemente des Arrays. Wird mit Argumenten aufgerufen (Element, Index, Array). Geben Sie true zurück, um das Element beizubehalten, andernfalls false

Wenn Sie nur eine Erklärung wünschen. Array filter() wie der Name vermuten lässt. Entfernen Sie unerwünschte Elemente, wenn die Bedingung falsch ist ( false ).

(arr > 0|| isNaN(arr) === true)

0,  false || false  //removed
1,  true || false  
2,  true || false
3,  true || false
'ate', false || true
'',   false|| false  // removed
false  false || false //removed

Ausgabe:

[1, 2, 3, "ate"]
0
Manwal