Effizienter jQuery sort-Methode für DOM-Elemente, basierend auf numerischen Attribut
Habe ich einige einfache jQuery geschrieben zu Sortieren, einige Elemente, basierend auf einem numerischen Attribut, wie dargestellt, an http://jsfiddle.net/MikeGrace/Vgavb/
//get array of elements
var myArray = $("#original div");
//sort based on timestamp attribute
myArray.sort(function (a, b) {
//convert to integers from strings
a = parseInt($(a).attr("timestamp"), 10);
b = parseInt($(b).attr("timestamp"), 10);
//compare
if(a > b) {
return 1;
} else if(a < b) {
return -1;
} else {
return 0;
}
});
//put sorted results back on page
$("#results").append(myArray);
Es funktioniert gut, aber ich glaube nicht, dass es skaliert werden, da insgesamt 185 jQuery-Aufrufe, 184 von denen, die immer das Attribut eines Elements zu tun, der Vergleich.
Was ist ein effizienter Weg, dies zu tun Sortierung mit jQuery?
- Versucht ein paar Dinge aber es sieht nicht aus wie das, was ich versuche, ist wirklich genug Unterschied, um wirklich mehr zu kümmern. jsperf.com/jquery-sort-by-numerical-property
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie besorgt über die Leistung, und sicher wissen, wo das Attribut kommt, können Sie die DOM-Methoden direkt,
.getAttribute()
in diesem Fall:Sie können den test hier den Unterschied, wie Sie sehen, es ist mehr als nur ein wenig Geschwindigkeit zu steigern,
.attr()
hat eine viel zusätzliche Arbeit intern, letztlich aufrufen.getAttribute()
sich in diesem Fall sowieso.Wenn Sie brauchen, um zu tun, viele Sortier-immer wieder, würde es gut sein, hin zu einem mehr einheitlichen Ansatz, der nicht um jQuery. Ansonsten gibt es wirklich nicht viel, der ist gehen, um einen spürbaren Unterschied.
Hier sind einige tests, versuchen ein paar verschiedene Ansätze -> http://jsperf.com/jquery-sort-by-numerical-property/2
Mit jQuery 1.6 Daten() viel schneller.
Erste:
Bedeutet dies den Zugriff auf die spezifischen Daten, Wert nach dem ersten ist intern, so dass keine DOM-lookup noch das Parsen der Wert muss getan werden.
Zweite:
Nun, dass der Wert wird intern gespeichert als Zahl, es muss nicht analysiert werden, jedes mal entweder.
Html
Javascript
Update jsFiddle Beispiel
Sicher, dass Ihre loops sind die gleichen, aber viel weniger Bearbeitung pro Schleife.
Für was es Wert ist, ich glaube nicht, dass Sie aufrufen müssen, die langsam parseInt:
Wenn Ihr Attribut timestamp ist wirklich nur eine Zahl, ich denke, diese ergeben den gleichen Wert.
Wenn Ihr Vergleich-Funktion ist teurer, als die standard-Methode ist die schwartzian-Transformation (gesehen in einigen Kommentaren, aber ohne ein Tatsächliches Beispiel):
Beispiel:
Statt eines Vergleichs-Funktion übergeben Sie eine Funktion, die Extrakte srings oder zahlen:
Dies ruft parseInt und attr, die nur einmal pro element, das ist immer weniger, als wenn aufgerufen, eine Vergleich-Funktion.