Mit Backbone.js habe ich eine Sammlung mit einer Komparatorfunktion eingerichtet. Es ist schön, die Modelle zu sortieren, aber ich möchte die Reihenfolge umkehren.
Wie kann ich die Modelle in absteigender Reihenfolge sortieren, anstatt aufsteigend?
javascript
backbone.js
Drew Dara-Abrams
quelle
quelle
Antworten:
Nun, Sie können negative Werte vom Komparator zurückgeben. Wenn wir zum Beispiel das Beispiel von der Backbone-Site nehmen und die Reihenfolge umkehren möchten, sieht es folgendermaßen aus:
quelle
Persönlich bin ich mit keiner der hier angegebenen Lösungen so zufrieden:
Die Lösung zum Multiplizieren mit -1 funktioniert nicht, wenn der Sortiertyp nicht numerisch ist. Obwohl es Möglichkeiten gibt, dies zu umgehen (indem Sie
Date.getTime()
beispielsweise anrufen ), sind diese Fälle spezifisch. Ich möchte einen allgemeinen Weg, um die Richtung jeglicher Art umzukehren, ohne mir Gedanken über den spezifischen Typ des zu sortierenden Feldes machen zu müssen.Für die String-Lösung scheint das Erstellen eines Strings zeichenweise ein Leistungsengpass zu sein, insbesondere bei Verwendung großer Sammlungen (oder großer Sortierfeld-Strings).
Hier ist eine Lösung, die für String-, Datums- und numerische Felder gut funktioniert:
Deklarieren Sie zunächst einen Komparator, der das Ergebnis eines Ergebnisses einer sortBy-Funktion wie folgt umkehrt:
Wenn Sie nun die Richtung der Sortierung umkehren möchten, müssen wir nur noch Folgendes tun:
Der Grund dafür ist, dass
Backbone.Collection.sort
sich das Verhalten anders verhält, wenn die Sortierfunktion zwei Argumente hat. In diesem Fall verhält es sich genauso wie der KomparatorArray.sort
. Diese Lösung funktioniert, indem die Funktion sortBy für einzelne Argumente in einen Komparator mit zwei Argumenten umgewandelt und das Ergebnis umgekehrt wird.quelle
Der Sammlungskomparator von Backbone.js basiert auf der Underscore.js-Methode _.sortBy. Die Art und Weise, wie sortBy implementiert wird, führt dazu, dass Javascript .sort () so "eingepackt" wird, dass das umgekehrte Sortieren von Zeichenfolgen schwierig wird. Durch einfaches Negieren des Strings wird NaN zurückgegeben und die Sortierung unterbrochen.
Wenn Sie eine umgekehrte Sortierung mit Strings durchführen müssen, z. B. eine umgekehrte alphabetische Sortierung, ist dies eine wirklich hackige Methode:
Es ist keineswegs hübsch, aber es ist ein "String Negator". Wenn Sie keine Bedenken haben, native Objekttypen in Javascript zu ändern, können Sie den Code klarer gestalten, indem Sie den String-Negator extrahieren und als Methode für String.Prototype hinzufügen. Sie möchten dies jedoch wahrscheinlich nur tun, wenn Sie wissen, was Sie tun, da das Ändern nativer Objekttypen in Javascript unvorhergesehene Folgen haben kann.
quelle
Meine Lösung bestand darin, die Ergebnisse nach dem Sortieren umzukehren.
Um doppeltes Rendern zu verhindern, sortieren Sie zuerst mit Silent und lösen Sie dann 'Reset' aus.
quelle
-Date.getTime()
, möglicherweise mit etwas mehr Hacking, wenn Sie glauben, dass Dates in Ihrem System die Unix-Epoche überschreiten werden. In alphabetischer Reihenfolge sehen Sie sich Andrews Antwort oben an.Ändern Sie Ihre Komparatorfunktion, um einen umgekehrten Proportionalwert zurückzugeben, anstatt die Daten zurückzugeben, die Sie gerade sind. Einige Codes von: http://documentcloud.github.com/backbone/#Collection-comparator
Beispiel:
quelle
Folgendes hat bei mir gut funktioniert:
quelle
Ich habe einige gelesen, in denen die Backbone-Komparatorfunktion die JavaScript-Funktion Array.prototype.sort () verwendet oder nachahmt. Dies bedeutet, dass entweder 1, -1 oder 0 verwendet wird, um die Sortierreihenfolge für jedes Modell in der Sammlung festzulegen. Dies wird ständig aktualisiert und die Sammlung bleibt in der richtigen Reihenfolge basierend auf dem Komparator.
Informationen zu Array.prototype.sort () finden Sie hier: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort?redirectlocale=de-US&redirectslug=JavaScript% 2FReference% 2FGlobal_Objects% 2FArray% 2Fsort
Viele Antworten auf diese Frage kehren einfach die Reihenfolge um, bevor sie auf die Seite gerendert werden. Das ist nicht ideal.
Mit dem obigen Artikel über Mozilla als Leitfaden konnte ich meine Sammlung mit dem folgenden Code in umgekehrter Reihenfolge sortieren. Dann rendern wir die Sammlung einfach in der aktuellen Reihenfolge auf Seite und können ein Flag (reverseSortDirection) zum Umkehren der Reihenfolge verwenden .
Mit Ausnahme der beiden Modelle von Comparator wird bei Änderungen an der Sammlung oder dem Modell die Kompartimentfunktion ausgeführt und die Reihenfolge der Sammlung geändert.
Ich habe diesen Ansatz mit Numbers and Strings getestet und er scheint perfekt für mich zu funktionieren.
Ich hoffe wirklich, dass diese Antwort helfen kann, da ich viele Male mit diesem Problem zu kämpfen habe und normalerweise eine Problemumgehung verwende.
quelle
sortKey
undreverseSortDirection
und Anruf.sort()
von einem beliebigen Ansicht , die einen Griff an der Sammlung. Für mich einfacher als andere Antworten mit höheren Stimmen.Dies kann elegant erfolgen, indem die sortBy-Methode überschrieben wird. Hier ist ein Beispiel
Sie können es also folgendermaßen verwenden:
Diese Lösung hängt nicht vom Feldtyp ab.
quelle
quelle
Hier ist eine wirklich einfache Lösung für diejenigen, die einfach die aktuelle Reihenfolge umdrehen möchten. Dies ist nützlich, wenn Sie eine Tabelle haben, deren Spalten in zwei Richtungen angeordnet werden können.
Sie können es mit so etwas kombinieren, wenn Sie an der Tischhülle (Coffeescript) interessiert sind:
quelle
Für umgekehrte Reihenfolge auf ID:
quelle
Ich hatte eine etwas andere Anforderung, da ich meine Modelle in einer Tabelle anzeigte und sie nach jeder Spalte (Modelleigenschaft) und entweder aufsteigend oder absteigend sortieren wollte.
Es hat eine Menge Zeit gekostet, um alle Fälle zum Laufen zu bringen (wobei Werte Zeichenfolgen, leere Zeichenfolgen, Datumsangaben, Zahlen sein können. Ich denke jedoch, dass dies ziemlich nahe ist.
verwenden:
quelle
Ich habe gerade die Sortierfunktion überschrieben, um das Modellarray nach Abschluss umzukehren. Außerdem habe ich das Auslösen des Sortierereignisses erst nach Abschluss des Rückwärtsgangs unterbrochen.
quelle
Ich bin kürzlich auf dieses Problem gestoßen und habe gerade beschlossen, eine rsort-Methode hinzuzufügen.
Hoffentlich findet das jemand nützlich
quelle
Hier ist eine schnelle und einfache Möglichkeit, die Modelle einer Sammlung mithilfe von UnderscoreJS rückwärts zu sortieren
quelle