Apakah ada cara yang lebih efisien untuk mengubah HTMLCollection ke Array, selain iterasi melalui isi dari koleksi tersebut dan secara manual mendorong setiap item ke dalam array?
javascript
arrays
object
Tom
sumber
sumber
for (var a=[], i=collection.length; i;) a[--i] = collection[i];
jadi tidak banyak "penipu" di sana :-)Array.prototype.slice.call
dan Brave (berdasarkan Chrome 59.0.3071) memiliki hampir tidak ada perbedaan antara dua tes javascript selama beberapa berjalan. Lihat jsperf.com/htmlcollection-array-vs-jquery-childrenJawaban:
akan memiliki efek yang sama menggunakan kode "asli".
Edit
Karena ini mendapat banyak pandangan, perhatikan (per @ oriol's komentar) bahwa ungkapan yang lebih ringkas berikut ini secara efektif setara:
Tetapi perhatikan per komentar JussiR, bahwa tidak seperti bentuk "verbose", itu membuat contoh array kosong, tidak digunakan, dan memang tidak dapat digunakan dalam proses. Apa yang dilakukan kompiler tentang hal ini adalah di luar ken programmer.
Edit
Sejak ECMAScript 2015 (ES 6) ada juga Array.from :
Edit
ECMAScript 2015 juga menyediakan operator spread , yang secara fungsional setara dengan
Array.from
(meskipun catatan yangArray.from
mendukung fungsi pemetaan sebagai argumen kedua).Saya telah mengkonfirmasi bahwa kedua hal di atas berfungsi
NodeList
.Perbandingan kinerja untuk metode yang disebutkan: http://jsben.ch/h2IFA
sumber
[].slice.call(htmlCollection)
juga berfungsi.Array.from
, yaitufrom
, tidak didukung oleh IE11.tidak yakin apakah ini yang paling efisien, tetapi sintaksis ES6 singkatnya mungkin:
Sunting: Yang lain, dari komentar Chris_F:
sumber
Array.from()
Array.from
, yaitufrom
, tidak didukung oleh IE11.Saya melihat metode yang lebih ringkas untuk mendapatkan
Array.prototype
metode secara umum yang juga berfungsi. MengubahHTMLCollection
objek menjadiArray
objek ditunjukkan di bawah ini:Dan, seperti disebutkan dalam komentar, untuk browser lama seperti IE7 dan sebelumnya, Anda hanya perlu menggunakan fungsi kompatibilitas, seperti:
Saya tahu ini adalah pertanyaan lama, tetapi saya merasa jawaban yang diterima sedikit tidak lengkap; jadi saya pikir saya akan membuang ini di sana FWIW.
sumber
Untuk implementasi lintas browser saya sarankan Anda melihat fungsi prototype.js
$A
disalin dari 1.6.1 :
Mungkin tidak digunakan
Array.prototype.slice
karena tidak tersedia di setiap browser. Saya khawatir kinerjanya sangat buruk karena ada kembali adalah javascript loop di atasiterable
.sumber
$A
fungsi yang paling sering dilakukan.Ini adalah solusi pribadi saya, berdasarkan informasi di sini (utas ini):
Di mana $ A dijelaskan oleh Gareth Davis dalam jabatannya:
Jika browser mendukung cara terbaik, ok, kalau tidak akan menggunakan browser lintas.
sumber
[,,]
menjadi[undefined, undefined]
.Ini berfungsi di semua browser termasuk versi IE sebelumnya.
Karena jsperf masih turun saat ini, berikut adalah jsfiddle yang membandingkan kinerja berbagai metode. https://jsfiddle.net/qw9qf48j/
sumber
var args = (htmlCollection.length === 1 ? [htmlCollection[0]] : Array.apply(null, htmlCollection));
Untuk mengonversi array-suka menjadi array dengan cara yang efisien, kita dapat menggunakan jQuery
makeArray
:Pemakaian:
Sedikit tambahan:
Jika Anda tidak ingin tetap merujuk ke objek array (sebagian besar waktu HTMLCollections berubah secara dinamis sehingga lebih baik untuk menyalinnya ke array lain, Contoh ini memperhatikan kinerja:
Seperti apa array itu?
HTMLCollection adalah
"array-like"
objek, array seperti benda mirip dengan objek array, tetapi kehilangan banyak definisi fungsional nya:sumber