Existe-t-il un moyen plus efficace de convertir une HTMLCollection en tableau, autre que d'itérer à travers le contenu de ladite collection et de pousser manuellement chaque élément dans un tableau?
392
Existe-t-il un moyen plus efficace de convertir une HTMLCollection en tableau, autre que d'itérer à travers le contenu de ladite collection et de pousser manuellement chaque élément dans un tableau?
for (var a=[], i=collection.length; i;) a[--i] = collection[i];
donc pas beaucoup de "con" là :-)Array.prototype.slice.call
et Brave (basé sur Chrome 59.0.3071) n'a pratiquement aucune différence entre les deux tests javascript sur plusieurs exécutions. Voir jsperf.com/htmlcollection-array-vs-jquery-childrenRéponses:
aura le même effet en utilisant du code "natif".
Éditer
Comme cela obtient beaucoup de vues, notez (selon le commentaire de @ oriol) que l'expression plus concise suivante est effectivement équivalente:
Mais notez selon le commentaire de @ JussiR, que contrairement au formulaire "verbeux", il crée une instance de tableau vide, inutilisée et en fait inutilisable dans le processus. Ce que les compilateurs font à ce sujet est en dehors du ken du programmeur.
Éditer
Depuis ECMAScript 2015 (ES 6) il y a aussi Array.from :
Éditer
ECMAScript 2015 fournit également l' opérateur d'étalement , qui est fonctionnellement équivalent à
Array.from
(bien que la note prenne enArray.from
charge une fonction de mappage comme deuxième argument).J'ai confirmé que les deux ci-dessus fonctionnent
NodeList
.Une comparaison des performances pour les méthodes mentionnées: http://jsben.ch/h2IFA
la source
[].slice.call(htmlCollection)
fonctionne également.Array.from
, c'est-à-dire qu'ilfrom
n'est pas pris en charge par IE11.Je ne sais pas si c'est le plus efficace, mais une syntaxe ES6 concise pourrait être:
Edit: Un autre, du commentaire de Chris_F:
la source
Array.from()
Array.from
, c'est-à-dire qu'ilfrom
n'est pas pris en charge par IE11.J'ai vu une méthode plus concise pour obtenir des
Array.prototype
méthodes en général qui fonctionne aussi bien. La conversion d'unHTMLCollection
objet enArray
objet est illustrée ci-dessous:Et, comme mentionné dans les commentaires, pour les anciens navigateurs tels que IE7 et les versions antérieures, vous devez simplement utiliser une fonction de compatibilité, comme:
Je sais que c'est une vieille question, mais je sentais que la réponse acceptée était un peu incomplète; donc je pensais que je jetterais ça là FWIW.
la source
Pour une implémentation multi-navigateur, je vous suggère de regarder la fonction prototype.js
$A
copié depuis 1.6.1 :
Il n'utilise
Array.prototype.slice
probablement pas car il n'est pas disponible sur tous les navigateurs. Je crains que les performances ne soient assez mauvaises car il y a un repli est une boucle javascript sur leiterable
.la source
$A
fonction la plupart du temps.Ceci est ma solution personnelle, basée sur les informations ici (ce fil):
Où $ A a été décrit par Gareth Davis dans son article:
Si le navigateur prend en charge la meilleure façon, ok, sinon, vous utiliserez le navigateur croisé.
la source
[,,]
devient ainsi[undefined, undefined]
.Cela fonctionne dans tous les navigateurs, y compris les versions antérieures d'IE.
Étant donné que jsperf est toujours en panne pour le moment, voici un jsfiddle qui compare les performances de différentes méthodes. https://jsfiddle.net/qw9qf48j/
la source
var args = (htmlCollection.length === 1 ? [htmlCollection[0]] : Array.apply(null, htmlCollection));
Pour convertir un tableau en tableau de manière efficace, nous pouvons utiliser jQuery
makeArray
:Usage:
Un petit plus:
Si vous ne souhaitez pas conserver de référence à l'objet tableau (la plupart du temps, HTMLCollections est modifié dynamiquement, il est donc préférable de les copier dans un autre tableau, cet exemple porte une attention particulière aux performances:
Qu'est-ce qu'un tableau?
HTMLCollection est un
"array-like"
objet, semblable à un tableau d' objets sont similaires à l'objet de tableau mais il manque beaucoup de sa définition fonctionnelle:la source