Поняття масиву (Firefox 30-57)
Примітка: розуміння масиву ніколи не були стандартизовані, і вони застаріли за допомогою Firefox 58. Використовуйте на свій страх.
Спочатку специфікація ECMAScript 7 містила купу нових функцій на основі масиву. Хоча більшість з них не перетворити його в доопрацьованій версії, підтримка Firefox (редактор) , можливо , найбільший з цих функцій: фантазії новий синтаксис , який може замінити .filter
і .map
з for(a of b)
синтаксисом. Ось приклад:
b.filter(a=>/\s/.test(a)).map(a=>a.length)
[for(a of b)if(/\s/.test(a))a.length]
Як бачите, два рядки не всі такі різні, крім другого, що не містять об'ємних ключових слів і функцій стрілок. Але це пояснює лише замовлення .filter().map()
; що станеться, якщо у вас .map().filter()
замість цього? Це дійсно залежить від ситуації:
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]
Або що , якщо ви хочете або .map
або .filter
? Ну, зазвичай виходить менш гаразд:
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]
Так що моя порада використовувати осягнення масиву , де ви зазвичай використовуєте .map
і .filter
, але не тільки один чи інші.
Строкові розуміння
Приємно в розумінні ES7 - це те, що на відміну від функцій, характерних для масиву, таких як .map
і .filter
, вони можуть використовуватися на будь-якому ітерабельному об'єкті, а не лише на масивах. Це особливо корисно при роботі зі струнами. Наприклад, якщо ви хочете запустити кожен символ c
у рядку через c.charCodeAt()
:
x=>[...x].map(c=>c.charCodeAt())
x=>[for(c of x)c.charCodeAt()]
Це два байти, збережені в досить малому масштабі. А що робити, якщо ви хочете відфільтрувати певні символи в рядку? Наприклад, цей зберігає лише великі літери:
x=>[...x].filter(c=>c<'['&&c>'@')
x=>[for(c of x)if(c<'['&&c>'@')c]
Хм, це не коротше. Але якщо поєднати два:
x=>[...x].filter(c=>c<'['&&c>'@').map(c=>c.charCodeAt())
x=>[for(c of x)if(c<'['&&c>'@')c.charCodeAt()]
Нічого собі, цілих 10 байт збережено!
Ще однією перевагою розуміння рядків є те, що рядки з жорстким кодом економлять зайвий байт, оскільки ви можете опустити простір після 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]
Індексація
Зрозуміння масиву ускладнює отримання поточного індексу в рядку / масиві, але це можна зробити:
a.map((x,i)=>x+i).filter ((x,i)=>~i%2)
[for(x of(i=0,a))if(++i%2)x+i-1]
Головне, на що слід бути обережним, - це переконатися, що індекс збільшується щоразу , а не лише коли виконується умова.
Розуміння генератора
Розуміння генератора мають в основному такий же синтаксис, як і розуміння масиву; просто замініть дужки дужками:
x=>(for(c of x)if(c<'['&&c>'@')c.charCodeAt())
Це створює генератор, який функціонує приблизно так само, як масив, але це історія для іншої відповіді.
Підсумок
В основному, хоча розуміння зазвичай коротше .map().filter()
, все зводиться до специфіки ситуації. Найкраще спробувати обидва способи і побачити, що виходить краще.
PS Не соромтеся запропонувати ще одну пораду щодо розуміння чи спосіб покращити цю відповідь!