¿Existe una forma más eficiente de convertir una colección HTMLC en una matriz, que no sea iterar a través del contenido de dicha colección y empujar manualmente cada elemento en una matriz?
javascript
arrays
object
Tom
fuente
fuente
for (var a=[], i=collection.length; i;) a[--i] = collection[i];
así que no hay mucha "estafa" allí :-)Array.prototype.slice.call
y Brave (basado en Chrome 59.0.3071) prácticamente no tiene diferencia entre las dos pruebas de JavaScript en varias ejecuciones. Ver jsperf.com/htmlcollection-array-vs-jquery-childrenRespuestas:
tendrá el mismo efecto usando el código "nativo".
Editar
Dado que esto obtiene muchas vistas, tenga en cuenta (según el comentario de @ oriol) que la siguiente expresión más concisa es efectivamente equivalente:
Pero tenga en cuenta según el comentario de @ JussiR, que a diferencia de la forma "detallada", crea una instancia de matriz vacía, no utilizada y, de hecho, inutilizable en el proceso. Lo que los compiladores hacen al respecto está fuera del conocimiento del programador.
Editar
Desde ECMAScript 2015 (ES 6) también existe Array.from :
Editar
ECMAScript 2015 también proporciona el operador de propagación , que es funcionalmente equivalente a
Array.from
(aunque tenga en cuenta queArray.from
admite una función de mapeo como segundo argumento).He confirmado que ambos de los anteriores funcionan
NodeList
.Una comparación de rendimiento para los métodos mencionados: http://jsben.ch/h2IFA
fuente
[].slice.call(htmlCollection)
también funciona.Array.from
, es decirfrom
, no es compatible con IE11.No estoy seguro si este es el más eficiente, pero una sintaxis concisa de ES6 podría ser:
Editar: Otro, del comentario de Chris_F:
fuente
Array.from()
Array.from
, es decirfrom
, no es compatible con IE11.Vi un método más conciso para obtener
Array.prototype
métodos en general que funciona igual de bien. La conversión de unHTMLCollection
objeto en unArray
objeto se muestra a continuación:Y, como se menciona en los comentarios, para navegadores antiguos como IE7 y anteriores, simplemente tiene que usar una función de compatibilidad, como:
Sé que esta es una vieja pregunta, pero sentí que la respuesta aceptada estaba un poco incompleta; así que pensé en tirar esto por ahí FWIW.
fuente
Para una implementación de navegador cruzado, te sugiero que mires prototype.js
$A
funcióncopiado de 1.6.1 :
Array.prototype.slice
Probablemente no se use porque no está disponible en todos los navegadores. Me temo que el rendimiento es bastante malo, ya que el retroceso es un bucle de JavaScript sobre eliterable
.fuente
$A
función la mayor parte del tiempo.Esta es mi solución personal, basada en la información aquí (este hilo):
Donde $ A fue descrito por Gareth Davis en su publicación:
Si el navegador admite la mejor manera, está bien, de lo contrario usará el navegador cruzado.
fuente
[,,]
convierte[undefined, undefined]
.Esto funciona en todos los navegadores, incluidas las versiones anteriores de IE.
Dado que jsperf todavía está inactivo en este momento, aquí hay un jsfiddle que compara el rendimiento de diferentes métodos. https://jsfiddle.net/qw9qf48j/
fuente
var args = (htmlCollection.length === 1 ? [htmlCollection[0]] : Array.apply(null, htmlCollection));
Para convertir una matriz en matriz de manera eficiente, podemos hacer uso de jQuery
makeArray
:Uso:
Un poco extra:
Si no desea mantener una referencia al objeto de matriz (la mayoría de las veces, las colecciones HTMLC cambian dinámicamente, por lo que es mejor copiarlas en otra matriz, este ejemplo presta mucha atención al rendimiento:
¿Qué es una matriz?
Colección HTMLC es un
"array-like"
objeto, el tipo array objetos son similares a objeto de matriz, pero falta una gran cantidad de su definición funcional:fuente