Apa cara paling efisien untuk memfilter atau memetakan nodelist di ES6?
Berdasarkan pembacaan saya, saya akan menggunakan salah satu opsi berikut:
[...nodelist].filter
atau
Array.from(nodelist).filter
Mana yang akan Anda rekomendasikan? Dan apakah ada cara yang lebih baik, misalnya tanpa melibatkan array?
javascript
arrays
filter
ecmascript-6
nodelist
Christophe
sumber
sumber
babel
, maka[...coll]
hanya akan memanggilArray.from(coll)
apa pun yang bukan fileArray
....
sintaks mungkin tidak didukung oleh IDE yang lebih lama sementaraArray.from()
itu hanya metode biasa.Jawaban:
[...nodelist]
akan membuat sebuah array dari sebuah objek jika objek tersebut dapat diulang.Array.from(nodelist)
akan membuat sebuah array dari sebuah objek jika objek iterable atau jika objek tersebut seperti array (has.length
dan numeric props)Kedua contoh Anda akan sama jika
NodeList.prototype[Symbol.iterator]
ada, karena kedua kasus mencakup iterable. Jika lingkungan Anda belum dikonfigurasi sedemikian rupa sehinggaNodeList
dapat diulang, contoh pertama Anda akan gagal, dan yang kedua akan berhasil.Babel
saat ini tidak menangani kasus ini dengan benar .Jadi jika Anda
NodeList
dapat iterable, terserah Anda yang mana yang Anda gunakan. Saya kemungkinan besar akan memilih berdasarkan kasus per kasus. Salah satu manfaatnyaArray.from
adalah dibutuhkan argumen kedua dari fungsi pemetaan, sedangkan yang pertama[...iterable].map(item => item)
harus membuat array sementara,Array.from(iterable, item => item)
tidak akan. Namun, jika Anda tidak memetakan daftar, itu tidak masalah.sumber
TL; DR;
Array.prototype.slice.call(nodelist).filter
Metode slice () mengembalikan larik. Array yang dikembalikan itu adalah salinan dangkal dari koleksi (NodeList)
Jadi ini bekerja lebih cepat daripada Array.from ()Jadi itu bekerja secepat Array.from ()Elemen dari koleksi asli disalin ke dalam larik yang dikembalikan sebagai berikut:
Penjelasan singkat tentang argumen
Array.prototype.slice (beginIndex, endIndex)
Array.prototype.slice.call (namespace, beginIndex, endIndex)
sumber
Array.from
tidak. Saatnya mencari mesin IE. Sekarang saya benar-benar bingung karena saya bisa menggunakan Array.from di IE10 dan IE11: \. Metode ini berfungsi di IE10 + 11 tetapi saya tidak dimudahkan oleh Array.from bekerja ketika semua dokumentasi mengatakan sebaliknya.Array.from
tidak bekerja untuk saya di IE11 Objek tidak mendukung properti atau metode 'dari'Array.from
juga mengembalikan salinan dangkal. Jadi saya tidak melihat bagaimana Anda menyimpulkan bahwa itu bekerja lebih cepat dariArray#slice
.Saya menemukan referensi yang menggunakan
map
langsung di NodeList olehArray.prototype.map.call(nodelist, fn)
Saya belum mengujinya, tetapi tampaknya masuk akal bahwa ini akan lebih cepat karena harus mengakses NodeList secara langsung.
sumber
Bagaimana dengan ini:
// Be evil. Extend the prototype. if (window.NodeList && !NodeList.prototype.filter) { NodeList.prototype.filter = Array.prototype.filter; } // Use it like you'd expect: const noClasses = document .querySelectorAll('div') .filter(div => div.classList.length === 0)
Ini pendekatan yang sama seperti yang disebutkan dalam dokumen MDN untuk NodeList.forEach (di bawah 'Polyfill'), ini bekerja untuk IE11 , Edge, Chrome dan FF.
sumber