Le moyen le plus efficace de convertir un HTMLCollection en un tableau

Existe-t-il un moyen plus efficace de convertir un HTMLCollection en un tableau, autre que d'itérer le contenu de ladite collection et de pousser manuellement chaque élément dans un tableau?

236
demandé sur Tom 2008-10-21 22:04:53

7 réponses

var arr = Array.prototype.slice.call( htmlCollection )

Aura le même effet en utilisant le code "natif".

Modifier

Puisque cela obtient beaucoup de vues, notez (par le commentaire de @oriol) que l'expression plus concise suivante est effectivement équivalent:

var arr = [].slice.call(htmlCollection);

Mais notez par le commentaire de @ JussiR, que contrairement au formulaire "verbeux", il crée une instance de tableau vide, inutilisée et même inutilisable dans le processus. Ce que les compilateurs font à ce sujet est en dehors de celui du programmeur Ken.

Modifier

Depuis ECMAScript 2015 (ed 6) il y a aussi Tableau.à partir de:

var arr = Array.from(htmlCollection);
427
répondu harpo 2017-07-12 06:06:51

Je ne sais pas si c'est le plus efficace, mais une syntaxe ES6 concise pourrait être:

let arry = [...htmlCollection] 

Edit: un autre, de Chris_F commentaire:

let arry = Array.from(htmlCollection)
69
répondu mido 2016-06-14 14:29:58

J'ai vu une méthode plus concise pour obtenir des méthodes Array.prototype en général qui fonctionne aussi bien. La conversion d'un objet HTMLCollection en un objet Array est illustrée ci-dessous:

[].slice.call( yourHTMLCollectionObject );

Et, comme mentionné dans les commentaires, pour les anciens navigateurs tels que IE7 et plus tôt, Vous devez simplement utiliser une fonction de compatibilité, comme:

function toArray(x) {
    for(var i = 0, a = []; i < x.length; i++)
        a.push(x[i]);

    return a
}

Je sais que c'est une vieille question, mais j'ai senti que la réponse acceptée était un peu incomplète; alors j'ai pensé que je jeterais ceci là-bas FWIW.

18
répondu Codesmith 2016-01-20 21:23:46

Pour une implémentation cross browser, je vous suggère de regarder prototype.js $A la fonction

Copyed de 1.6.1:

function $A(iterable) {
  if (!iterable) return [];
  if ('toArray' in Object(iterable)) return iterable.toArray();
  var length = iterable.length || 0, results = new Array(length);
  while (length--) results[length] = iterable[length];
  return results;
}

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 soit assez mauvaise car il y a une boucle javascript sur le iterable.

5
répondu Gareth Davis 2009-12-09 08:21:29

Cela fonctionne dans tous les navigateurs, y compris les versions antérieures D'IE.

var arr = [];
[].push.apply(arr, htmlCollection);

Puisque jsperf est toujours en panne pour le moment, voici un jsfiddle qui compare les performances des différentes méthodes. https://jsfiddle.net/qw9qf48j/

3
répondu Nicholas 2016-08-19 06:54:14

C'est ma solution personnelle, basée sur les informations ici (ce fil):

var Divs = new Array();    
var Elemns = document.getElementsByClassName("divisao");
    try {
        Divs = Elemns.prototype.slice.call(Elemns);
    } catch(e) {
        Divs = $A(Elemns);
    }

Où $ A a été décrit par Gareth Davis dans son post:

function $A(iterable) {
  if (!iterable) return [];
  if ('toArray' in Object(iterable)) return iterable.toArray();
  var length = iterable.length || 0, results = new Array(length);
  while (length--) results[length] = iterable[length];
  return results;
}

Si le navigateur prend en charge la meilleure façon, ok, sinon utilisera le navigateur croisé.

2
répondu Gustavo 2013-05-16 19:35:08

Pour convertir un tableau en tableau de manière efficace, nous pouvons utiliser la jQuery makeArray :

MakeArray: Convertit un objet de type tableau en un vrai tableau JavaScript.

Utilisation:

var domArray = jQuery.makeArray(htmlCollection);

Un peu plus:

Si vous ne voulez pas garder une référence à l'objet array (la plupart du temps, HTMLCollections change dynamiquement, il est donc préférable de les copier dans un autre tableau, cet exemple porte une attention particulière aux performances:

var domDataLength = domData.length //Better performance, no need to calculate every iteration the domArray length
var resultArray = new Array(domDataLength) // Since we know the length its improves the performance to declare the result array from the beginning.

for (var i = 0 ; i < domDataLength ; i++) {
    resultArray[i] = domArray[i]; //Since we already declared the resultArray we can not make use of the more expensive push method.
}

Qu'est-ce que le tableau?

HTMLCollection est un objet "array-like", les objets de type tableau sont similaires à l'objet du tableau mais manquent beaucoup de sa définition fonctionnelle:

Les objets de type tableau ressemblent à des tableaux. Ils ont divers numérotés éléments et une propriété de longueur. Mais la ressemblance s'arrête. Les objets de type tableau n'ont aucune des fonctions du tableau, et for-in les boucles ne fonctionnent même pas!

0
répondu Shahar Shukrani 2018-07-10 18:40:55