93 votes

En JavaScript, quelle est la meilleure façon de convertir une NodeList en tableau ?

La méthode DOM document.querySelectorAll() (et quelques autres) renvoient un NodeList .

Pour opérer sur la liste, par exemple à l'aide de forEach() le NodeList doit d'abord être converti en un Array .

Quelle est la meilleure façon de convertir le NodeList à un Array ?

1 votes

Je pense que la valeur de retour de querySelectorAll() est techniquement appelée une NodeList.

0 votes

De mdm "elementList = document.querySelectorAll(selectors) ;"

1 votes

ElementList est le nom de la variable. Cette même page décrit comment le type de la valeur de retour est une NodeList.

85voto

Freezystem Points 2611

Avec ES6, vous pouvez simplement faire :

const spanList = [...document.querySelectorAll("span")];

4 votes

Cela me donne Type 'NodeListOf<Element>' must have a '[Symbol.iterator]()' method that returns an iterator.ts(2488)

1 votes

Bonjour @callback, cela semble être une erreur liée à TypeScript. Vous avez peut-être choisi de cibler la compilation es6 sans ajouter "es6" dans le tableau lib de votre fichier tsconfig. Salutations

1 votes

Bonjour @Freezystem, vous avez raison ! Je vise es2015. Merci !

73voto

sandstrom Points 2420

Avec ES6, vous pouvez utiliser Array.from(myNodeList) . Utilisez ensuite votre méthode de tableau préférée.

var myNodeList = document.querySelectorAll('.my-selector');

// ALT 1
Array.from(myNodeList).forEach(function(el) {
  console.log(el);
});

Utilisez un Cale ES6 pour que cela fonctionne aussi dans les anciens navigateurs.


Si vous utilisez un transpilateur (par exemple Babel), il existe deux autres possibilités :

var myNodeList = document.querySelectorAll('.my-selector');

// ALT 2
for (var el of myNodeList) {
  el.classList.add('active'); // or some other action
}

// ALT 3
[...myNodeList].forEach((el) => {
  console.log(el);
});

0 votes

N'est-il pas également vrai sous es6 qu'une nodeList fournit un itérateur ?

4 votes

@ccyoung mais l'itérateur ne fonctionne pas dans les navigateurs ES6 non conformes car on ne peut pas shimer l'objet Symbol, il est donc préférable d'utiliser Array.from(myNodeList) car elle peut être calée.

0 votes

J'ai donc ce problème où Array.from(el.childNodes) ne renvoie pas le premier nœud comme partie du tableau.

51voto

Joseph Silber Points 69582

Vous pouvez le convertir en un tableau en utilisant la fonction slice de la méthode Array prototype :

var elList = document.querySelectorAll('.viewcount');
elList = Array.prototype.slice.call(elList, 0);

De plus, si tout ce dont vous avez besoin est forEach vous pouvez invoquer que de la Array sans le transformer d'abord en tableau :

var elList = document.querySelectorAll('.viewcount');
Array.prototype.forEach.call(elList, function(el) {
    console.log(el);
});

En ES6, vous pouvez utiliser le nouveau Array.from pour le convertir en tableau :

Array.from(elList).forEach(function(el) {
    console.log(el);
});

Cette fonction n'est actuellement disponible que dans les navigateurs les plus récents, mais si vous êtes utiliser un service polyfill vous aurez accès à cette fonction dans tous les domaines.


Si vous utilisez un transpilateur ES6 vous pouvez même utiliser un for..of à la place :

for (var element of document.querySelectorAll('.some .elements')) {
  // use element here
}

22voto

c69 Points 5140

Pourquoi se convertir ? - juste call fonction de Array directement sur la collection d'éléments ;)

[].forEach.call( $('a'), function( v, i) {
    // do something
});

en supposant que $ est votre alias pour querySelectorAll bien sûr.


edit : ES6 permet une syntaxe encore plus courte [...$('a')] ( fonctionne uniquement dans Firefox, à partir de mai 2014 )

0 votes

En supposant que $ es querySelectorAll .

3 votes

Votre réponse implique l'utilisation de jQuery. Si c'est le cas, ces bêtises sont complètement inutiles, grâce à .each() .

1 votes

Lol, pourquoi ? rien ne t'interdit de faire des pseudonymes comme function $ ( s ) { return document.querySelectorAll(s); } .

14voto

mikemaccana Points 7470

Mise à jour 2020 : nodeList.forEach() est maintenant un standard officiel et pris en charge par tous les navigateurs actuels.

Les navigateurs plus anciens peuvent utiliser le polyfill ci-dessous.

Pour opérer sur la liste en javascript, par exemple en utilisant forEach(), la NodeList doit être convertie en Array.

Ce n'est pas vrai. .forEach() fonctionne dans les navigateurs actuels. S'il est absent, vous pouvez utiliser un polyfill pour ajouter .forEach() à partir de Array a Liste de nœuds et cela fonctionne bien :

if ( ! NodeList.prototype.forEach ) {
  NodeList.prototype.forEach = Array.prototype.forEach;
}

Vous pouvez maintenant courir :

myNodeList.forEach(function(node){...})

Pour itérer sur les NodeLists comme sur les Arrays.

Cela produit un code beaucoup plus court et plus propre que .call() partout.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X