Rolf B: Javascript includes einzelne Array Werte

Beitrag lesen

problematische Seite

Hallo ebody,

das ist genao so eine Pfeilfunktion, wie Du sie in deinem eigenen Code an die filter-Methode übergeben hast. Ich bin davon ausgegangen, dass Du weißt, was Du da verwendet hast. Aber vielleicht hast Du es ja auch nur für merkwürdige Syntax für die filter-Methode gehalten?!

Eine Pfeilfunktion ist grundsätzlich eine verkürzte Definition einer anonymen Funktion, also:

const ermittleGenre1 = (movie) => movie.genres;
const ermittleGenre2 = function(movie) { return movie.genres; }

ist beinahe das Gleiche. Die kleinen, aber gemeinen Unterschiede werden im Wiki beschrieben.

Was ist movie? Eigentlich müsste es ein Parameter sein, aber diesen gibt es gar nicht.

Ja, doch, den gibt es. Der ist links von dem => aufgeschrieben und wird dadurch als Parameter deklariert. Wenn Du mehr als einen Parameter brauchst, verwendest Du Klammern:

let summiere = (s1, s2) => s1 + s2;

ist identisch zu

function summiere(s1, s2) {
   return s1 + s2;
}

Ansonsten sind Pfeilfunktionen, genau wie klassische Funktionen, in JavaScript ganz normale Objekte, und das heißt, dass man sie nicht nur als Parameter übergeben kann, wie hier:

//                                 .-- Definition Pfeilfunktion
//                                 ! 
let ergebnis = movies.filter(movie => movie.fsk <= 6);
//                                              !
//                    Kleiner-Gleich Operator --'

Man kann sie auch an Variablen zuweisen und als Wert zurückgeben.

Und weil so eine Pfeilfunktion ganz schön verwirren kann, wenn in ihrer Nähe einer der Operatoren <= oder >= auftaucht, habe ich das lieber mal beschriftet 😉

Du könntest aber auch so filtern - und falls Du den IE unterstützen willst, musst Du das sogar, weil der die Pfeilfunktionen noch nicht kennt.

let ergebnis = movies.filter(function(movie) { return movie.fsk <= 6; });

Zur Frage nach der ausführlichen Schreibweise

return movie => genresToFind.some(genre => movie.genres.includes(genre));

Wäre das die ausführliche Schreibweise?

    return function(movie){
        if(genresToFind.some(
            if(movie.genres.includes(genre)){
             return true;
            }
        ){
            return true;
        }
    }

Nein, das wäre ein Syntaxfehler und es wäre auch nicht inhaltlich äquivalent.

  • es fehlt jeweils der else-Zweig für die if() Abfragen, der false zurückgibt
  • der fragliche Code enthält nicht nur eine Pfeilfunktion, sondern zwei. Du musst beide durch Funktionen ersetzen.
  • Ein if-Statement als Parameter für some ist syntaktisch nicht möglich. An dieser Stelle wird eine Funktion benötigt, die dieses if-Statement enthält.
   return function(movie){
      if (genresToFind.some(
             function(genre) {
                if(movie.genres.includes(genre)) {
                   return true;
                } else {
                   return false;
                }
             })) {
//               '-- gehört zum 1. IF
//             '---- gehört zum 1. IF
//            '----- schließende Klammer von .some(...
//           '------ schließende Klammer von function(genre) {
         return true;
      } else {
         return false;
      }
   }

Aber das ist nun viel zu ausführlich geschrieben. Einen IF-Block, der einen booleschen Wert auswertet und nichts anderes tut als true oder false zurückzugeben, braucht man nicht.

if (movie.genres.includes(genre)) {
   return true;
} else {
   return false;
}

ersetzt man durch

return movie.genres.includes(genre);

Die sinnvolle "ausführliche Schreibweise" wäre also diese:

   return function(movie) {
      return genresToFind.some(
                function(genre) {
                   return movie.genres.includes(genre);
                }
             );
   }

Rolf

--
sumpsi - posui - obstruxi