Laut Quellen von Underscore.JS ( Ссылка ):
%Vor%Die Funktionen chain () und value () sind nur einfache Wrapper für das Underscore-Objekt.
Also wenn ich folgende Konstruktion verwende:
%Vor%Underscore erstellt zwei Zwischensammlungen und führt drei Aufzählungen durch.
Warum werden die Methoden chain () und value () nicht so faul implementiert, wie LINQ seine Methoden implementiert? Zum Beispiel könnte diese Kette wie folgt behandelt werden:
%Vor%Gibt es JS-bezogene Probleme für diese Art von Implementierung?
Damit .chain()
faul ist, wie Sie es beschreiben, würde es fast zwei Versionen jeder Methode erfordern. Sie würden die unmittelbaren Antwortmethoden benötigen, die das tun, was die Dokumentation sagt (gibt ein Array zurück), und Sie würden die trägen Methoden benötigen, die lazy evaluation durchführen (gibt eine Funktion zurück, die später für jedes Element ausgeführt werden soll).
Eine Möglichkeit, dies zu implementieren, wäre, den gesamten Unterstrich als faul zu schreiben und dies als verketteten Unterstrich darzustellen. Setzen Sie dann den normalen Unterstrich als Wrapper mit einem trägen Unterstrich, der einen trägen Unterstrich aufruft, sofort auswertet und dann die Ergebnisse zurückgibt. Es gibt zwei Hauptprobleme: (1) es ist viel mehr Arbeit und (2) es ist eine völlig entgegengesetzte Architektur, die alle Unterstreichung erfordert, um als faul nur die faule Bewertung der Kettenmethode zu unterstützen.
Es ist sicherlich machbar, wie JSINQ und .NET LINQ zeigen, aber es gibt enorme Kosten in Bezug auf Entwicklerzeit für Entwicklung und Wartung, sowie erhöhte Komplexität und Wahrscheinlichkeit von Fehlern. Underscore bietet eine nicht träge Auswertung von 80 verschiedenen Hilfsmethoden in 1.200 Codezeilen. JSLinq bietet eine Lazy-Evaluierung von 21 verschiedenen Hilfsmethoden in 7.000 Codezeilen. Viel mehr Code, weniger Funktionen.
Es gibt einen Kompromiss. Jeder Entwickler muss seine eigenen Entscheidungen treffen (solange er für sich selbst arbeitet).
Ich glaube, Sie suchen nach etwas wie Lazy.js :
Lazy.js ist eine Utility-Bibliothek für JavaScript, ähnlich wie Underscore und Lo-Dash, aber mit einem wichtigen Unterschied: Lazy Evaluation (auch bekannt als Deferred Execution). Dies kann in vielen Fällen zu einer überlegenen Leistung führen, insbesondere wenn es sich um große Arrays handelt und / oder mehrere Methoden miteinander verkettet werden. Für einfache Fälle (
map
,filter
usw.) auf kleinen Arrays sollte Lazys Leistung ähnlich wie Underscore oder Lo-Dash sein.
Bearbeiten : Es sieht so aus, als ob Lo-Dash die Möglichkeit bietet, eine faule Auswertung vorzunehmen auch.
Tags und Links javascript linq performance underscore.js