Quelle est la manière la plus efficace de filtrer ou de mapper une liste de nœuds dans ES6?
Sur la base de mes lectures, j'utiliserais l'une des options suivantes:
[...nodelist].filter
ou
Array.from(nodelist).filter
Lequel recommanderiez-vous? Et y a-t-il de meilleures façons, par exemple, sans impliquer de tableaux?
javascript
arrays
filter
ecmascript-6
nodelist
Christophe
la source
la source
babel
,[...coll]
appellera alors simplement toutArray.from(coll)
ce qui n'est pas un fichierArray
....
syntaxe peut ne pas être prise en charge par les IDE plus anciens alors qu'elleArray.from()
n'est qu'une méthode classique.Réponses:
[...nodelist]
fera un tableau à partir d'un objet si l'objet est itérable.Array.from(nodelist)
fera un tableau à partir d'un objet si l'objet est itérable ou si l'objet est semblable à un tableau (a.length
et accessoires numériques)Vos deux exemples seront identiques s'ils
NodeList.prototype[Symbol.iterator]
existent, car les deux cas couvrent les itérables. Si votre environnement n'a pas été configuré de manière à êtreNodeList
itérable, votre premier exemple échouera et le second réussira.Babel
actuellement ne gère pas correctement ce cas .Donc, si votre
NodeList
est itérable, c'est vraiment à vous que vous l'utilisez. Je choisirais probablement au cas par cas. L'un des avantages deArray.from
est qu'il prend un deuxième argument d'une fonction de mappage, alors que le premier[...iterable].map(item => item)
devrait créer un tableau temporaire,Array.from(iterable, item => item)
non. Cependant, si vous ne mappez pas la liste, cela n'a pas d'importance.la source
TL, DR;
Array.prototype.slice.call(nodelist).filter
La méthode slice () renvoie un tableau. Ce tableau retourné est une copie superficielle de la collection (NodeList)
Donc il fonctionne plus vite que Array.from ()Donc ça marche aussi vite que Array.from ()Les éléments de la collection d'origine sont copiés dans le tableau renvoyé comme suit:
Brève explication des arguments
Array.prototype.slice (beginIndex, endIndex)
Array.prototype.slice.call (espace de noms, beginIndex, endIndex)
la source
Array.from
. Il est temps de trouver une machine IE. Maintenant, je suis vraiment confus car j'ai pu utiliser Array.from dans IE10 et IE11: \. Cette méthode fonctionne dans IE10 + 11, mais Array.fr ne me facilite pas la tâche lorsque toute la documentation dit le contraire.Array.from
ne fonctionne pas pour moi dans IE11 L' objet ne prend pas en charge la propriété ou la méthode 'from'Array.from
renvoie également une copie superficielle. Donc je ne vois pas comment vous concluez que cela fonctionne plus vite queArray#slice
.J'ai trouvé une référence qui utilise
map
directement sur la NodeList parArray.prototype.map.call(nodelist, fn)
Je ne l'ai pas testé, mais il semble plausible que ce soit plus rapide car il devrait accéder directement à la NodeList.
la source
Que dis-tu de ça:
// Be evil. Extend the prototype. if (window.NodeList && !NodeList.prototype.filter) { NodeList.prototype.filter = Array.prototype.filter; } // Use it like you'd expect: const noClasses = document .querySelectorAll('div') .filter(div => div.classList.length === 0)
C'est la même approche que celle mentionnée dans la documentation MDN pour NodeList.forEach (sous 'Polyfill'), cela fonctionne pour IE11 , Edge, Chrome et FF.
la source