Saya mencoba menggunakan objek Peta baru dari Javascript EC6, karena sudah didukung di versi Firefox dan Chrome terbaru.
Tapi saya menemukan itu sangat terbatas dalam pemrograman "fungsional", karena tidak memiliki peta klasik, filter dll metode yang akan bekerja dengan baik dengan [key, value]
pasangan. Memiliki forEach tapi itu TIDAK mengembalikan hasil panggilan balik.
Jika saya bisa mentransformasikannya map.entries()
dari MapIterator menjadi Array sederhana maka saya bisa menggunakan standar .map
, .filter
tanpa peretasan tambahan.
Apakah ada cara "baik" untuk mengubah Javascript Iterator menjadi Array? Dengan python semudah melakukannya list(iterator)
... tapi Array(m.entries())
kembalikan array dengan Iterator sebagai elemen pertama !!!
EDIT
Saya lupa menentukan Saya sedang mencari jawaban yang berfungsi di mana pun Peta berfungsi, yang berarti setidaknya Chrome dan Firefox (Array.from tidak berfungsi di Chrome).
PS.
Saya tahu ada wu.js fantastis tetapi ketergantungannya pada traceur membuat saya pergi ...
sumber
Jawaban:
Anda mencari
Array.from
fungsi baru yang mengubah iterables sewenang-wenang menjadi instance array:Sekarang didukung di Edge, FF, Chrome dan Node 4+ .
Tentu saja, mungkin layak untuk didefinisikan
map
,filter
dan metode serupa langsung pada antarmuka iterator, sehingga Anda dapat menghindari alokasi array. Anda juga mungkin ingin menggunakan fungsi generator alih-alih fungsi tingkat tinggi:sumber
(value, key)
pasangan dan bukan(value, index)
pasangan.yourTransformation = function([key, value], index) { … }
Map
memiliki pasangan nilai kunci. Oleh karena itu, menurut pendapat saya, tidak masuk akal untuk mendefinisikan fungsi umummap
danfilter
untuk iterator. Sebaliknya, setiap objek yang diulang harus memiliki fungsimap
danfilter
fungsinya masing-masing . Ini masuk akal karenamap
danfilter
yang struktur operasi melestarikan (mungkin tidakfilter
tapimap
pasti) dan karenanyamap
danfilter
fungsi harus tahu struktur dari objek iterable bahwa mereka pemetaan atas atau penyaringan. Pikirkan tentang itu, di Haskell kita mendefinisikan berbagai contohFunctor
. =)[...map.entries()]
atauArray.from(map.entries())
Sangat mudah.
Bagaimanapun - iterators kurang mengurangi, menyaring, dan metode serupa. Anda harus menulis sendiri, karena ini lebih perfomant daripada mengubah Peta ke array dan kembali. Tapi jangan lakukan lompatan Map -> Array -> Map -> Array -> Map -> Array, karena itu akan mematikan kinerja.
sumber
Array.from
sudah dicakup oleh @Bergi.[iterator]
tidak berfungsi karena di Chrome Chrome menciptakan array denganiterator
elemen tunggal di dalamnya, dan[...map.entries()]
bukan sintaks yang diterima di ChromeTidak perlu mengubah
Map
menjadiArray
. Anda cukup membuatmap
danfilter
fungsi untukMap
objek:Misalnya, Anda bisa menambahkan bang (yaitu
!
karakter) dengan nilai setiap entri peta yang kuncinya adalah primitif.Anda juga dapat menambahkan
map
danfilter
metodeMap.prototype
untuk membuatnya lebih baik dibaca. Meskipun umumnya tidak disarankan untuk memodifikasi prototipe asli, namun saya percaya bahwa pengecualian dapat dibuat dalam kasusmap
danfilter
untukMap.prototype
:Sunting: Dalam jawaban Bergi, ia menciptakan fungsi generik
map
danfilter
generator untuk semua objek yang dapat diubah. Keuntungan menggunakan mereka adalah karena mereka adalah fungsi generator, mereka tidak mengalokasikan objek iterable menengah.Sebagai contoh, fungsi saya
map
dan yangfilter
didefinisikan di atas membuatMap
objek baru . Karenanya panggilanobject.filter(primitive).map(appendBang)
menciptakan duaMap
objek baru :Menciptakan objek yang dapat ditengah-tengah adalah mahal. Fungsi generator Bergi memecahkan masalah ini. Mereka tidak mengalokasikan objek perantara tetapi memungkinkan satu iterator untuk memberi makan nilainya dengan malas ke yang berikutnya. Jenis optimasi ini dikenal sebagai fusi atau penggundulan hutan dalam bahasa pemrograman fungsional dan ini dapat secara signifikan meningkatkan kinerja program.
Satu-satunya masalah yang saya miliki dengan fungsi generator Bergi adalah bahwa mereka tidak spesifik untuk
Map
objek. Sebaliknya, mereka digeneralisasi untuk semua objek yang dapat diubah. Oleh karena itu alih-alih memanggil fungsi callback dengan(value, key)
pasangan (seperti yang saya harapkan ketika memetakan lebih dari aMap
), itu memanggil fungsi callback dengan(value, index)
pasangan. Kalau tidak, ini adalah solusi yang sangat baik dan saya pasti akan merekomendasikan menggunakannya atas solusi yang saya berikan.Jadi ini adalah fungsi generator spesifik yang akan saya gunakan untuk memetakan dan memfilter
Map
objek:Mereka dapat digunakan sebagai berikut:
Jika Anda ingin antarmuka yang lebih lancar maka Anda bisa melakukan sesuatu seperti ini:
Semoga itu bisa membantu.
sumber
Map
objek dengan benar menggunakan fungsimap
danfilter
fungsi khusus. Jawaban Bergi menunjukkan penggunaan generikmap
danfilter
fungsi untuk semua objek yang dapat diubah yang tidak dapat digunakan untuk mengubahMap
objek karena kunciMap
objek hilang.Array.from
tidak berfungsi di Chrome (sementara Peta dan iterator melakukannya!). Tapi saya bisa melihat pendekatannya sangat mirip dan Anda bisa menambahkan fungsi "toArray" ke grup Anda!toArray
fungsi.Pembaruan kecil dari 2019:
Sekarang Array.from tampaknya tersedia secara universal, dan, lebih jauh lagi, ia menerima argumen mapFn kedua , yang mencegahnya membuat array perantara. Ini pada dasarnya terlihat seperti ini:
sumber
Array.from
sudah ada, ini lebih cocok untuk dijadikan komentar atau edit yang diminta untuk jawaban itu ... tapi terima kasih!Anda bisa menggunakan perpustakaan seperti https://www.npmjs.com/package/itiriri yang mengimplementasikan metode mirip array untuk iterables:
sumber
Anda bisa mendapatkan array array (kunci dan nilai):
Dan kemudian, Anda dapat dengan mudah mendapatkan nilai dari dalam, seperti misalnya tombol dengan iterator peta.
sumber
Anda juga dapat menggunakan fasih-iterable untuk mengubah ke array:
sumber