Le moyen le plus efficace pour convertir un HTMLCollection à un Tableau
Est-il un moyen plus efficace pour convertir un HTMLCollection à un Tableau, d'autres que l'itération à travers le contenu de cette collection et manuellement en poussant chaque élément dans un tableau?
- Qu'entend-on par "efficace"? Si les plus performants, d'une boucle for est généralement plus rapide qu'un Tableau.le prototype.la tranche. Une boucle fonctionne également dans une plus grande variété de navigateurs (c'est à dire tous), de sorte que par ces critères, il est le "plus efficace". Et c'est très peu de code:
for (var a=[], i=collection.length; i;) a[--i] = collection[i];
donc pas beaucoup d'un "con" là 🙂 - Merci, je voudrais vous donner +59k si je le pouvais! 😉
- Regarde navigateur actuel de la performance, tranche a surtout pris avec les boucles en termes de performance, à l'exception de Chrome. À l'aide d'un plus grand nombre d'éléments et légère optimisation de la boucle, le les résultats sont presque identiques, sauf dans Chrome lorsqu'une boucle est beaucoup plus rapide.
- J'ai créé un jsperf test qui examine à la fois les méthodes que @harpo mentionnées ainsi que jquery test de performance. J'ai trouvé jquery est légèrement plus lent que les deux méthodes javascript, des performances au top varie entre la js cas de test. Chrome 59.0.3071 / Mac OS X 10.12.5 préfère utiliser
Array.prototype.slice.call
et Courageux (basé sur Chrome 59.0.3071) a pratiquement pas de différence entre les deux contrôles javascript sur plusieurs pistes. Voir jsperf.com/htmlcollection-array-vs-jquery-children
Vous devez vous connecter pour publier un commentaire.
aura le même effet à l'aide de "native" du code.
Modifier
Depuis ce reçoit beaucoup de points de vue, la note (par @oriol commentaire) que les plus concise expression est efficacement équivalent:
Mais note par @JussiR commentaire, que, contrairement à la "commentaires" du formulaire, il crée un vide, non utilisé, et en effet inutilisables en l'occurrence de array dans le processus. Les compilateurs faire à ce sujet est à l'extérieur de l'entreprise de programmation de ken.
Modifier
Depuis ECMAScript 2015 (ed 6) il est également Tableau.à partir de:
Modifier
ECMAScript 2015 prévoit également la la propagation de l'opérateur, qui est fonctionnellement équivalent à
Array.from
(à noter toutefois que laArray.from
prend en charge une fonction de mappage en tant que deuxième argument).J'ai confirmé que les deux travailler sur
NodeList
.[].slice.call(htmlCollection)
fonctionne également.Array.from
, c'est à direfrom
, n'est pas pris en charge par IE11.[3, 5, 7].slice()
. Qui crée et renvoie un nouveau Tableau basé sur les indices transmis àslice
. Lorsque vous transmettez pas d'arguments, il copie l'ensemble du tableau. HTML collections n'ont pasArray
dans leur chaîne de prototype, de sorte que vous ne pouvez pas utiliser laslice
méthode sur des références. Toutefois, si vous utilisezcall()
(qui est surFunction.prototype
) pour invoquerArray.prototype.slice
sur un tableau comme objet, il accomplit la même chose. Espérons que cette aide![...htmlColl].forEach((i)=>{//do})
ne sais pas si c'est le plus efficace, mais concis ES6 syntaxe pourrait être:
Edit: une Autre, d'une Chris_F commentaire:
Array.from()
Array.from
, c'est à direfrom
, n'est pas pris en charge par IE11.[...htmlCollection]
ne fonctionne pas dans le Bord.J'ai vu un plus concis méthode pour obtenir de l'
Array.prototype
méthodes en général, qui fonctionne tout aussi bien. La conversion d'unHTMLCollection
objet dans unArray
objet est démontré ci-dessous:Et, comme mentionné dans les commentaires, pour les anciens navigateurs tels que IE7 et plus tôt, vous devez simplement utiliser une compatibilité fonction, comme:
Je sais que c'est une vieille question, mais j'ai senti que l'on a accepté la réponse a été un peu incomplète; j'ai donc pensé que je jetterais ce FWIW.
Pour un navigateur croix de la mise en œuvre que j'avais sugguest vous regardez prototype.js
$A
fonctioncopyed de 1.6.1:
Il n'utilise pas
Array.prototype.slice
probablement parce qu'il n'est pas disponible sur tous les navigateurs. J'ai peur que la performance est assez mauvais comme il l'automne est de retour d'une boucle javascript sur leiterable
.$A
fonction n'est la plupart du temps.C'est ma solution personnelle, sur la base des informations ici (ce fil):
Où $A été décrit par Gareth Davis dans son post:
Si le navigateur prend en charge de la meilleure façon, ok, sinon vous allez utiliser le navigateur croix.
[,,]
devient[undefined, undefined]
.Cela fonctionne dans tous les navigateurs y compris plus tôt les versions IE.
Depuis jsperf est toujours à la baisse en ce moment, voici un jsfiddle qui compare les performances des différentes méthodes. https://jsfiddle.net/qw9qf48j/
var args = (htmlCollection.length === 1 ? [htmlCollection[0]] : Array.apply(null, htmlCollection));
Pour convertir le tableau comme le tableau de manière efficace, nous pouvons utiliser la jQuery
makeArray
:Utilisation:
Un peu plus:
Si vous ne souhaitez pas conserver la référence à l'objet array (la plupart du temps HTMLCollections sont dynamiquement les changements de sorte que son meilleur pour les copier dans un autre tableau, Cet exemple payer une attention particulière à la performance:
Ce qui est semblable au tableau?
HTMLCollection est un
"array-like"
objet, le semblable au tableau objets sont semblables à la matrice de l'objet, mais manque beaucoup de ses fonctionnellement définition: