Was ist der effizienteste Weg, um eine Knotenliste in ES6 zu filtern oder zuzuordnen?
Basierend auf meinen Messwerten würde ich eine der folgenden Optionen verwenden:
[...nodelist].filter
oder
Array.from(nodelist).filter
Welches würdest du empfehlen? Und gibt es bessere Möglichkeiten, zum Beispiel ohne Arrays?
javascript
arrays
filter
ecmascript-6
nodelist
Christophe
quelle
quelle
babel
,[...coll]
fordern Sie einfachArray.from(coll)
alles an, was kein istArray
....
Syntax wird möglicherweise von älteren IDEs nicht unterstützt, obwohl diesArray.from()
nur eine reguläre Methode ist.Antworten:
[...nodelist]
macht ein Array aus einem Objekt, wenn das Objekt iterierbar ist.Array.from(nodelist)
macht ein Array aus einem Objekt, wenn das Objekt iterierbar ist oder wenn das Objekt Array-ähnlich ist (hat.length
und numerische Requisiten)Ihre beiden Beispiele sind identisch, falls
NodeList.prototype[Symbol.iterator]
vorhanden, da beide Fälle iterable abdecken. Wenn Ihre Umgebung nicht so konfiguriert wurde, dass sieNodeList
iteriert werden kann, schlägt Ihr erstes Beispiel fehl und das zweite ist erfolgreich. behandelt diesen FallBabel
derzeit nicht richtig .Wenn Ihr
NodeList
also iterierbar ist, liegt es wirklich an Ihnen, was Sie verwenden. Ich würde wahrscheinlich von Fall zu Fall wählen. Ein Vorteil davonArray.from
ist, dass ein zweites Argument einer Zuordnungsfunktion erforderlich ist, während das erste[...iterable].map(item => item)
ein temporäres Array erstellenArray.from(iterable, item => item)
müsste , dies jedoch nicht. Wenn Sie die Liste jedoch nicht zuordnen, spielt dies keine Rolle.quelle
TL; DR;
Array.prototype.slice.call(nodelist).filter
Die Slice () -Methode gibt ein Array zurück. Das zurückgegebene Array ist eine flache Kopie der Sammlung (NodeList).
Es funktioniert also schneller als Array.from ().Es funktioniert also genauso schnell wie Array.from ()Elemente der ursprünglichen Sammlung werden wie folgt in das zurückgegebene Array kopiert:
Kurze Erklärung zu den Argumenten
Array.prototype.slice (beginIndex, endIndex)
Array.prototype.slice.call (Namespace, beginIndex, endIndex)
quelle
Array.from
dies nicht der Fall ist. Zeit, eine IE-Maschine zu finden. Jetzt bin ich wirklich verwirrt, weil ich Array.from in IE10 und IE11 verwenden konnte: \. Diese Methode funktioniert in IE10 + 11, aber Array.from funktioniert nicht, wenn in der gesamten Dokumentation etwas anderes angegeben ist.Array.from
funktioniert nicht für mich in IE11 Objekt unterstützt keine Eigenschaft oder Methode 'von'Array.from
Gibt auch eine flache Kopie zurück. Ich verstehe also nicht, wie Sie zu dem Schluss kommen, dass es schneller funktioniert alsArray#slice
.Ich habe eine Referenz gefunden , die
map
direkt in der NodeList von verwendet wirdArray.prototype.map.call(nodelist, fn)
Ich habe es nicht getestet, aber es scheint plausibel, dass dies schneller sein würde, da es direkt auf die NodeList zugreifen sollte.
quelle
Wie wäre es damit:
// 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)
Es ist der gleiche Ansatz wie in den MDN-Dokumenten für NodeList.forEach (unter 'Polyfill') erwähnt. Er funktioniert für IE11 , Edge, Chrome und FF.
quelle