Hallo,
Okay, nicht wirklich eine Frage. ...eher eine Spielerei, quasi für hier anwesende Javascript Nerds wie mich :)
Es sei angemerkt, alles "funktioniert", folgendes also eine REINE Verständnisfrage:
Bin in meinem Code über die Situation gestolpert, dass ich aus einem Array "arr" mit Buchstaben von "a" bis "z" alle Konsonanten herausfiltern wollte. Dazu habe ich ein Array
const vowels = ["a", "e", "i", "o", "u"];
geschaffen und dann die Konsonanten wie folgt gefiltert:
// BEWEISSTÜCK 1
const consonants = arr.filter(cur => !vowels.find(el => el === cur));
Gleichsam ließen sich natürlich die Vokale filtern:
// BEWEISSTÜCK 2
const newVowels = arr.filter(cur => vowels.find(el => el === cur)); // "vowels" vs "newVowels" - SÄMTLICHE Naming Conventions out the window :O
NUN ZUR EIGENTLICHEN FRAGE!:
WARUM funktioniert das eigentlich?
filter() siebt alle als "true" zurückgegebenen Werte aus. find() hingegen liefert ja NICHT explizit "true" oder "false", sondern den ersten gefundenen Wert, BZW.(!) "undefined", wenn kein Wert gefunden wurde. BEWEISSTÜCK 1 lässt sich daher übersetzen als
const consonants = arr.filter(cur => !undefined); // Konsonanten werden in vowels ja nicht gefunden!
"!undefined" === "true", daher soweit alles gut
BEWEISSTÜCK 2 aber gibt ja nicht explizit true zurück, sondern den ersten Wert, der ein Match ergibt, daher
const newVowels = arr.filter(cur => "a"); // bzw. "e", "i",... je nach Wert von "cur", hier ist "cur" "a"
Warum wird hier der zurückgegebene Vokal (in diesem Beispiel bei diesem Durchgang "a") als "true" von filter() interpretiert?
Wie beschrieben... Spielerei... trotzdem danke!
Pep