Array-Verständnis (Firefox 30-57)
Hinweis: Das Array-Verständnis wurde nie standardisiert und wurde mit Firefox 58 überholt. Verwenden Sie es auf eigene Gefahr.
Ursprünglich enthielt die ECMAScript 7-Spezifikation eine Reihe neuer Array-basierter Funktionen. Obwohl die meisten davon nicht in die endgültige Version kamen, unterstützt Firefox (ed) möglicherweise die größte dieser Funktionen: Fantasievolle neue Syntax, die .filter
und .map
durch for(a of b)
Syntax ersetzen kann . Hier ist ein Beispiel:
b.filter(a=>/\s/.test(a)).map(a=>a.length)
[for(a of b)if(/\s/.test(a))a.length]
Wie Sie sehen, unterscheiden sich die beiden Zeilen nur geringfügig. Die zweite Zeile enthält keine umfangreichen Schlüsselwörter und Pfeilfunktionen. Dies erklärt aber nur die Reihenfolge .filter().map()
; Was passiert, wenn Sie .map().filter()
stattdessen haben? Es kommt wirklich auf die Situation an:
b.map(a=>a[0]).filter(a=>a<'['&&a>'@')
[for(a of b)if(a<'['&&a>'@')a[0]]
b.map(a=>c.indexOf(a)).filter(a=>a>-1)
[for(a of b)if((d=c.indexOf(a))>-1)d]
b.map(a=>a.toString(2)).filter(a=>/01/.test(a))
[for(a of b)if(/01/.test(c=a.toString(2)))c]
Oder was ist, wenn Sie entweder .map
oder wollen .filter
? Nun, es stellt sich normalerweise als weniger OK heraus:
b.map(a=>a.toString(2))
[for(a of b)a.toString(2)]
b.filter(a=>a%3&&a%5)
[for(a of b)if(a%3&&a%5)a]
Mein Rat ist also, Array-Verständnis dort zu verwenden, wo Sie es normalerweise verwenden würden, .map
und .filter
nicht nur das eine oder das andere.
String-Verständnis
Das Schöne am ES7-Verständnis ist, dass sie im Gegensatz zu Array-spezifischen Funktionen wie .map
und .filter
für jedes iterierbare Objekt und nicht nur für Arrays verwendet werden können. Dies ist besonders nützlich, wenn Sie mit Zeichenfolgen arbeiten. Wenn Sie beispielsweise jedes Zeichen c
in einer Zeichenfolge ausführen möchten, gehen Sie wie folgt vor c.charCodeAt()
:
x=>[...x].map(c=>c.charCodeAt())
x=>[for(c of x)c.charCodeAt()]
Das sind zwei Bytes, die in relativ geringem Umfang eingespart werden. Und was ist, wenn Sie bestimmte Zeichen in einer Zeichenfolge filtern möchten? Zum Beispiel enthält dieser nur Großbuchstaben:
x=>[...x].filter(c=>c<'['&&c>'@')
x=>[for(c of x)if(c<'['&&c>'@')c]
Hmm, das ist nicht kürzer. Aber wenn wir beides kombinieren:
x=>[...x].filter(c=>c<'['&&c>'@').map(c=>c.charCodeAt())
x=>[for(c of x)if(c<'['&&c>'@')c.charCodeAt()]
Wow, ganze 10 Bytes gespart!
Ein weiterer Vorteil des Zeichenfolgenverständnisses besteht darin, dass fest codierte Zeichenfolgen ein zusätzliches Byte einsparen, da Sie das Leerzeichen weglassen können, nachdem of
:
x=>[...'[](){}<>'].map(c=>x.split(c).length-1)
x=>[for(c of'[](){}<>')x.split(c).length-1]
x=>[...'[](){}<>'].filter(c=>x.split(c).length>3)
x=>[for(c of'[](){}<>')if(x.split(c).length>3)c]
Indizierung
Das Array-Verständnis macht es etwas schwieriger, den aktuellen Index in der Zeichenfolge / dem Array abzurufen. Dies kann jedoch folgendermaßen geschehen:
a.map((x,i)=>x+i).filter ((x,i)=>~i%2)
[for(x of(i=0,a))if(++i%2)x+i-1]
Das Wichtigste, worauf Sie achten müssen, ist sicherzustellen, dass der Index jedes Mal erhöht wird , nicht nur, wenn eine Bedingung erfüllt ist.
Verständnis des Generators
Generatorverständnisse haben grundsätzlich die gleiche Syntax wie Arrayverständnisse. Ersetzen Sie einfach die Klammern durch Klammern:
x=>(for(c of x)if(c<'['&&c>'@')c.charCodeAt())
Dies erzeugt einen Generator , der ähnlich wie ein Array funktioniert, aber das ist eine Geschichte für eine andere Antwort.
Zusammenfassung
Grundsätzlich .map().filter()
kommt es auf die Besonderheiten der Situation an , obwohl das Verständnis in der Regel kürzer ist als . Probieren Sie es am besten in beide Richtungen aus und finden Sie heraus, was besser funktioniert.
PS Sie können gerne einen anderen verständnisbezogenen Tipp vorschlagen oder eine Möglichkeit finden, diese Antwort zu verbessern!