Я пытаюсь использовать новый объект Map из Javascript EC6, поскольку он уже поддерживается в последних версиях Firefox и Chrome.
Но я нахожу его очень ограниченным в «функциональном» программировании, потому что в нем отсутствуют классические методы отображения, фильтрации и т. Д., Которые бы прекрасно работали с [key, value]
парой. У него есть forEach, но он НЕ возвращает результат обратного вызова.
Если бы я мог преобразовать его map.entries()
из MapIterator в простой массив, я бы тогда мог использовать стандарт .map
, .filter
без дополнительных хаков.
Есть ли «хороший» способ превратить Javascript Iterator в массив? В python это так же просто, как делать list(iterator)
... но Array(m.entries())
вернуть массив с Итератором в качестве первого элемента !!!
РЕДАКТИРОВАТЬ
Я забыл указать, что я ищу ответ, который работает везде, где работает Map, что означает, по крайней мере, Chrome и Firefox (Array.from не работает в Chrome).
PS.
Я знаю, что есть фантастический wu.js, но его зависимость от traceur отталкивает меня ...
источник
Ответы:
Вы ищете новую
Array.from
функцию, которая преобразует произвольные итерации в экземпляры массива:Теперь он поддерживается в Edge, FF, Chrome и Node 4+ .
Конечно, было бы целесообразно , чтобы определить
map
,filter
и подобные методы непосредственно на интерфейс итератора, так что вы можете избежать выделения массива. Вы также можете использовать функцию генератора вместо функций более высокого порядка:источник
(value, key)
пары, а не(value, index)
пары.yourTransformation = function([key, value], index) { … }
Map
есть пары ключ-значение. Следовательно, по моему скромному мнению, нет смысла определять общиеmap
иfilter
функции для итераторов. Вместо этого каждый повторяемый объект должен иметь свои собственные функцииmap
иfilter
функции. Это имеет смысл , такmap
иfilter
являются структурой сохраняющих операций (возможно , неfilter
но ,map
конечно , есть) и , следовательно,map
иfilter
функции должны знать структуру итерации объектов , которые они картирование над или фильтрацией. Подумайте об этом, в Хаскеле мы определяем разные случаиFunctor
. =)[...map.entries()]
илиArray.from(map.entries())
Это супер легко.
В любом случае - итераторам не хватает методам Reduce, Filter и подобных. Вы должны написать их самостоятельно, так как это более удобно, чем преобразование Map в массив и обратно. Но не делайте прыжков Карта -> Массив -> Карта -> Массив -> Карта -> Массив, потому что это снизит производительность.
источник
Array.from
уже была охвачена @Bergi.[iterator]
он не работает, потому что в Chrome он создает массив с однимiterator
элементом и[...map.entries()]
не является принятым синтаксисом в ChromeТам нет необходимости превращать
Map
вArray
. Вы можете просто создатьmap
иfilter
функции дляMap
объектов:Например, вы можете добавить удар (т.е.
!
символ) к значению каждой записи карты, ключ которой является примитивом.Вы также можете добавить
map
иfilter
методы,Map.prototype
чтобы сделать его лучше читаемым. Хотя обычно не рекомендуется модифицировать собственные прототипы, тем не менее, я считаю, что исключение может быть сделано в случаеmap
иfilter
дляMap.prototype
:Редактировать: В ответе Берги он создал универсальные
map
иfilter
генераторные функции для всех итерируемых объектов. Преимущество их использования состоит в том, что, поскольку они являются функциями генератора, они не выделяют промежуточные итерируемые объекты.Например, функции my
map
иfilter
определенные выше создают новыеMap
объекты. Следовательно, вызовobject.filter(primitive).map(appendBang)
создает два новыхMap
объекта:Создание промежуточных итерируемых объектов стоит дорого. Функции генератора Берги решают эту проблему. Они не распределяют промежуточные объекты, но позволяют одному итератору лениво передавать свои значения следующему. Этот вид оптимизации известен как слияние или вырубка лесов в функциональных языках программирования, и он может значительно улучшить производительность программы.
Единственная проблема, с которой я сталкиваюсь с функциями генератора Берги, заключается в том, что они не являются специфичными для
Map
объектов. Вместо этого они обобщаются для всех итерируемых объектов. Следовательно, вместо вызова функций обратного вызова с(value, key)
парами (как и следовало ожидать при отображении через aMap
), он вызывает функции обратного вызова с(value, index)
парами. В противном случае это отличное решение, и я бы определенно рекомендовал использовать его над решениями, которые я предоставил.Так что это конкретные функции генератора, которые я бы использовал для отображения и фильтрации
Map
объектов:Их можно использовать следующим образом:
Если вы хотите более гибкий интерфейс, вы можете сделать что-то вроде этого:
Надеюсь, это поможет.
источник
Map
объектов, используя специализированные функцииmap
иfilter
функции. Ответ Берги демонстрирует использование универсальныхmap
иfilter
функций для всех итерируемых объектов, которые нельзя использовать для преобразованияMap
объектов, поскольку ключиMap
объекта потеряны.Array.from
в Chrome не работает (в то время как Map и итераторы работают!). Но я вижу, что подход очень похож, и вы можете просто добавить функцию «toArray» в вашу группу!toArray
функцию.Небольшое обновление с 2019 года:
Теперь Array.from кажется общедоступным и, кроме того, он принимает второй аргумент mapFn , который не позволяет ему создавать промежуточный массив. В основном это выглядит так:
источник
Array.from
уже существует, это больше подходит для комментария или запроса на изменение этого ответа ... но спасибо!Вы можете использовать библиотеку, такую как https://www.npmjs.com/package/itiriri, которая реализует методы, подобные массиву для итераций:
источник
Вы можете получить массив массивов (ключ и значение):
И тогда вы можете легко получить значения изнутри, как, например, ключи с помощью итератора карты.
источник
Вы также можете использовать плавную итерацию для преобразования в массив:
источник