rodneyrehm: Das zweite von tausend Elementen finden

Beitrag lesen

Moin,

Es geht mir generell um einen Iterator, der stoppt, sobald das gewünschte nte Element gefunden ist, und der nicht zuerst alle Elemente sucht und dann erst das nte Element herausfiltert.

Du musst bedenken, dass man auf die Implementierungsdetails von document.querySelectorAll() keinen Einfluss hat. Man weiß nicht welcher konkrete Algorithmus bei der Suche eingesetzt wird (Die Spezifikation gibt das nicht eindeutigst vor). Da das zurückgegebene NodeList Objekt die Menge der gefundenen Elemente kennt, darf man davon ausgehen, dass keine interne Optimierung durch bspw. den Einsatz von Generators stattfinden kann, was aber die Basis für eine inkrementelle Suche - und deinen Wunsch nach einem terminierenden Iterator - wäre.

Ziemlich seltsam, daß es so einen Iterator für die Suche von DOM-Elementen in Javascript nicht zu geben scheint

Mit den "Standardmitteln", ist dein Problem wohl nicht zu lösen. Da du aber ohnehin Anforderungen hast, die über das alltägliche hinausgehen, möchtest du dir vielleicht den TreeWalker genauer anschauen. Dieses Interface ermöglicht dir einen sehr tiefen aber dennoch komfortablen Eingriff in die DOM-Suche. Der TreeWalker enthält dabei nichts weiter als die Beschreibung wie gesucht werden soll und eine Iterator-Implementierung, die dir die absolute Kontrolle über den Suchvorgang gibt.

Ob du jedoch mit einem TreeWalker tatsächlich besser (also schneller, performanter) fährst, als mit dem handelsüblichen querySelectorAll() bleibt noch zu messen. Dafür bietet sich jsperf an.

…, in jeder anständigen Programmiersprache ist das selbstverständlich, Beispiel Python:

# hier wird nicht zuerst eine Liste mit Hundert Millionen Elementen erzeugt,
# sondern ein Iterator verwendet, weshalb das Programm sofort beendet ist.
for x in range(100000000):
    # zum Vergleich nachfolgende Zeilen mit einem 'pass'-Statement ersetzen
    if x==5: 
        break

Nach einer kurzen Recherche stellt sich heraus, dass Python 2 eine Liste aller Werte generierte und zurück gab, erst in Python 3 wird der nächste Wert erst beim Abruf berechnet. Dieses Konzept nennt man gemeinhin "Generator". "Iterator" ist lediglich das definierte Interface zum Durchlaufen von Sequenzen, sagt aber nichts über die Erstellung der Sequenz aus. Generator kommen mit ES6 nach JavaScript - das wird aber auf querySelectorAll() keinen Einfluss haben.

Grüße, Rod