Zrozumienie tablic (Firefox 30-57)
Uwaga: interpretacje tablic nigdy nie były znormalizowane i stały się przestarzałe w Firefoksie 58. Używaj na własne ryzyko.
Początkowo specyfikacja ECMAScript 7 zawierała wiele nowych funkcji opartych na macierzy. Chociaż większość z nich nie dotarła do wersji finalnej, obsługa Firefoksa (ed) prawdopodobnie największa z tych funkcji: wymyślna nowa składnia, która może zastąpić .filter
i .map
ze for(a of b)
składnią. Oto przykład:
b.filter(a=>/\s/.test(a)).map(a=>a.length)
[for(a of b)if(/\s/.test(a))a.length]
Jak widać, dwie linie nie różnią się od siebie tak bardzo, że druga nie zawiera nieporęcznych słów kluczowych i funkcji strzałek. Ale to tylko uwzględnia zamówienie .filter().map()
; co się stanie, jeśli .map().filter()
zamiast tego? To zależy od sytuacji:
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]
Albo co jeśli chcesz albo .map
albo .filter
? Cóż, zwykle okazuje się mniej OK:
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]
Więc moja rada jest użycie składni dla tablic gdziekolwiek byś zwykle używają .map
i .filter
, ale nie tylko jedną lub drugą stronę.
Rozumienie ciągów
Zaletą w zrozumieniu ES7 jest to, że w przeciwieństwie do funkcji specyficznych dla tablicy, takich jak .map
i .filter
, można ich używać na dowolnym obiekcie iterowalnym, nie tylko tablicach. Jest to szczególnie przydatne, gdy mamy do czynienia z łańcuchami. Na przykład, jeśli chcesz uruchomić każdy znak c
w ciągu c.charCodeAt()
:
x=>[...x].map(c=>c.charCodeAt())
x=>[for(c of x)c.charCodeAt()]
To dwa bajty zapisane na dość małą skalę. A co jeśli chcesz filtrować określone znaki w ciągu? Na przykład ten zawiera tylko wielkie litery:
x=>[...x].filter(c=>c<'['&&c>'@')
x=>[for(c of x)if(c<'['&&c>'@')c]
Hmm, to nie jest krótsze. Ale jeśli połączymy dwa:
x=>[...x].filter(c=>c<'['&&c>'@').map(c=>c.charCodeAt())
x=>[for(c of x)if(c<'['&&c>'@')c.charCodeAt()]
Wow, zapisano całe 10 bajtów!
Kolejną zaletą ciągów znaków jest to, że ciągi zakodowane na stałe oszczędzają dodatkowy bajt, ponieważ można pominąć spację po 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]
Indeksowanie
Zrozumienie tablic utrudnia uzyskanie bieżącego indeksu w ciągu / tablicy, ale można to zrobić:
a.map((x,i)=>x+i).filter ((x,i)=>~i%2)
[for(x of(i=0,a))if(++i%2)x+i-1]
Najważniejsze, aby zachować ostrożność, aby upewnić się, że indeks jest zwiększany za każdym razem, a nie tylko wtedy, gdy spełniony jest warunek.
Zrozumienie generatora
Zrozumienia generatora mają zasadniczo tę samą składnię, co zeznania tablicowe; wystarczy zastąpić nawiasy klamrowe:
x=>(for(c of x)if(c<'['&&c>'@')c.charCodeAt())
Tworzy to generator, który działa w taki sam sposób jak tablica, ale to historia na inną odpowiedź.
Podsumowanie
Zasadniczo, chociaż rozumienie jest zwykle krótsze niż .map().filter()
wszystko, wszystko sprowadza się do specyfiki sytuacji. Najlepiej jest wypróbować to na dwa sposoby i sprawdzić, które z nich działa lepiej.
PS Nie wahaj się zasugerować inną wskazówkę dotyczącą zrozumienia lub sposób na poprawienie tej odpowiedzi!