Ich habe eine Liste von Objekten, die ich basierend auf einem Feld attr
vom Typ Zeichenfolge sortieren möchte . Ich habe es versucht-
list.sort(function (a, b) {
return a.attr - b.attr
})
Es wurde jedoch festgestellt, dass -
dies mit Zeichenfolgen in JavaScript nicht funktioniert. Wie kann ich eine Liste von Objekten basierend auf einem Attribut mit Typzeichenfolge sortieren?
javascript
string
Airportyh
quelle
quelle
JavaScript case insensitive string comparison
auf stackoverflow.com/questions/2140627/…Javascript : remove accents/diacritics in strings
auf stackoverflow.com/questions/990904/…Antworten:
Verwenden Sie
String.prototype.localeCompare
ein Beispiel:Wir erzwingen, dass a.attr eine Zeichenfolge ist, um Ausnahmen zu vermeiden.
localeCompare
wird seit Internet Explorer 6 und Firefox 1 unterstützt. Möglicherweise wird auch der folgende verwendete Code angezeigt, der ein Gebietsschema nicht berücksichtigt:quelle
localeCompare()
stößt nicht auf dieses Problem, versteht aber keine Zahlen, sodass Sie ["1", "10", "2"] erhalten, wie beim Sortieren von Vergleichen in den meisten Sprachen. Wenn Sie für Ihr UI-Frontend sortieren möchten, schauen Sie sich den Algorithmus alphanum / natural sort an. stackoverflow.com/questions/4340227/… oder stackoverflow.com/questions/4321829/…localeCompare()
nur in modernen Browsern unterstützt wird: IE11 + zum Zeitpunkt des Schreibens, siehe developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…localeCompare()
das Zurücksetzen vieler Versionen, unterstützt jedoch nicht die Angabe des Gebietsschemas bis Version 11. Beachten Sie auch die Fragen, mit denen Dead.Rabit verknüpft ist.Eine aktualisierte Antwort (Oktober 2014)
Ich war wirklich verärgert über diese natürliche Sortierreihenfolge, daher habe ich einige Zeit gebraucht, um dieses Problem zu untersuchen. Ich hoffe das hilft.
Um es kurz zu machen
localeCompare()
Charakterunterstützung ist schlecht, benutze sie einfach. Wie bereits erwähnt,Shog9
lautet die Antwort auf Ihre Frage:Fehler, die in allen benutzerdefinierten Javascript-Implementierungen "Sortierung nach natürlicher Zeichenfolge" gefunden wurden
Es gibt eine ganze Reihe von benutzerdefinierten Implementierungen, die versuchen, einen String-Vergleich genauer durchzuführen, der als "natürliche String-Sortierreihenfolge" bezeichnet wird.
Beim "Spielen" mit diesen Implementierungen fiel mir immer eine seltsame "natürliche Sortierreihenfolge" auf, oder eher Fehler (oder Auslassungen im besten Fall).
In der Regel werden Sonderzeichen (Leerzeichen, Bindestrich, kaufmännisches Und, Klammern usw.) nicht korrekt verarbeitet.
Sie werden dann feststellen, dass sie an verschiedenen Stellen gemischt erscheinen. Dies kann normalerweise sein:
Wenn man erwartet hätte, dass alle Sonderzeichen an einem Ort "gruppiert" werden, außer vielleicht dem Leerzeichen-Sonderzeichen (das immer das erste Zeichen wäre). Das heißt, entweder alle vor Zahlen oder alle zwischen Zahlen und Buchstaben (Klein- und Großbuchstaben werden nacheinander "zusammen") oder alle nach Buchstaben.
Mein Fazit ist, dass sie alle keine konsistente Reihenfolge liefern, wenn ich anfange, kaum ungewöhnliche Zeichen hinzuzufügen (dh Zeichen mit diakritischen Zeichen oder Zeichen wie Bindestrich, Ausrufezeichen usw.).
Recherche zu benutzerdefinierten Implementierungen:
Natural Compare Lite
https://github.com/litejs/natural-compare-lite : Fehler beim konsistenten Sortieren https://github.com/litejs/natural-compare-lite/issues/1 und http://jsbin.com/bevututodavi/ 1 / edit? Js, Konsole , grundlegende lateinische Zeichen sortieren http://jsbin.com/bevututodavi/5/edit?js,consoleNatural Sort
https://github.com/javve/natural-sort : Fehler beim konsistenten Sortieren, siehe Problem https://github.com/javve/natural-sort/issues/7 und grundlegende lateinische Zeichen beim Sortieren von http: // jsbin. com / cipimosedoqe / 3 / edit? js, KonsoleJavascript Natural Sort
https://github.com/overset/javascript-natural-sort : scheint seit Februar 2012 eher vernachlässigt zu sein. Fehler beim konsistenten Sortieren, siehe Ausgabe https://github.com/overset/javascript-natural-sort/issues/16Alphanum
http://www.davekoelle.com/files/alphanum.js , Fehler beim konsistenten Sortieren, siehe http://jsbin.com/tuminoxifuyo/1/edit?js,consoleBrowsers native "Natural String Sort Order" -Implementierungen über
localeCompare()
localeCompare()
Die älteste Implementierung (ohne die Argumente für Gebietsschemas und Optionen) wird von IE6 + unterstützt (siehe http://msdn.microsoft.com/en-us/library/ie/s4esdbwz(v=vs.94).aspx (scrollen Sie nach unten zu localeCompare ()). ) Methode). Die integriertelocaleCompare()
Methode eignet sich viel besser zum Sortieren, auch für internationale und Sonderzeichen. Das einzige Problem bei der Verwendung derlocaleCompare()
Methode besteht darin, dass "das verwendete Gebietsschema und die verwendete Sortierreihenfolge vollständig von der Implementierung abhängen". Mit anderen Worten, wenn Sie localeCompare wie stringOne.localeCompare (stringTwo) verwenden: Firefox, Safari, Chrome und IE haben eine andere Sortierreihenfolge für Strings.Recherche zu den browser-nativen Implementierungen:
Schwierigkeit der "natürlichen Sortierreihenfolge der Zeichenfolge"
Die Implementierung eines soliden Algorithmus (dh konsistent, aber auch für eine Vielzahl von Zeichen) ist eine sehr schwierige Aufgabe. UTF8 enthält mehr als 2000 Zeichen und umfasst mehr als 120 Skripte (Sprachen) . Schließlich gibt es einige Spezifikationen für diese Aufgaben, die als "Unicode-Kollatierungsalgorithmus" bezeichnet werden und unter http://www.unicode.org/reports/tr10/ zu finden sind . Weitere Informationen hierzu finden Sie zu dieser Frage, die ich unter /software/257286/is-there-any-language-agnostic-specification-for-string-natural-sorting-order veröffentlicht habe
Schlußfolgerung
In Anbetracht des aktuellen Unterstützungsniveaus der benutzerdefinierten Javascript-Implementierungen, auf die ich gestoßen bin, werden wir wahrscheinlich nie sehen, dass irgendetwas der Unterstützung all dieser Zeichen und Skripte (Sprachen) nahe kommt. Daher würde ich lieber die native localeCompare () -Methode des Browsers verwenden. Ja, es hat den Nachteil, dass es in allen Browsern nicht konsistent ist, aber grundlegende Tests zeigen, dass es einen viel größeren Bereich von Zeichen abdeckt und solide und aussagekräftige Sortierreihenfolgen ermöglicht.
Wie bereits erwähnt,
Shog9
lautet die Antwort auf Ihre Frage:Weiterführende Literatur:
Dank der netten Antwort von Shog9, die mich in die "richtige" Richtung gebracht hat, glaube ich
quelle
Antwort (in Modern ECMAScript)
Oder
Beschreibung
Das Umwandeln eines booleschen Werts in eine Zahl ergibt Folgendes:
true
->1
false
->0
Betrachten Sie drei mögliche Muster:
(x > y) - (y < x)
->1 - 0
->1
(x > y) - (y < x)
->0 - 0
->0
(x > y) - (y < x)
->0 - 1
->-1
(Alternative)
+(x > y) || -(x < y)
->1 || 0
->1
+(x > y) || -(x < y)
->0 || 0
->0
+(x > y) || -(x < y)
->0 || -1
->-1
Diese Logik entspricht also typischen Sortierkomparatorfunktionen.
quelle
localeCompare
und Standardvergleich liefern unterschiedliche Ergebnisse. Was erwartest du?["A", "b", "C", "d"].sort((a, b) => a.localeCompare(b))
sortiert in alphabetischer Reihenfolge ohne["A", "b", "C", "d"].sort((a, b) => (a > b) - (a < b))
Sie sollten hier> oder <und == verwenden. Die Lösung wäre also:
quelle
Verschachtelte ternäre Pfeilfunktion
quelle
Da Zeichenfolgen direkt in Javascript verglichen werden können, ist dies der Fall
Die Subtraktion in einer Sortierfunktion wird nur verwendet, wenn eine nicht alphabetische (numerische) Sortierung gewünscht wird und natürlich nicht mit Zeichenfolgen funktioniert
quelle
Ich hatte mich lange darum gekümmert, also habe ich es endlich recherchiert und dir diesen langwierigen Grund gegeben, warum die Dinge so sind, wie sie sind.
Aus der Spezifikation :
Nun gehen wir zu 11.9.6
Das ist es. Der Operator "Triple Equals", der auf Zeichenfolgen angewendet wird, gibt "true" zurück, wenn die Argumente genau dieselben Zeichenfolgen sind (gleiche Länge und gleiche Zeichen an entsprechenden Positionen).
Dies
===
funktioniert auch in den Fällen, in denen wir versuchen, Zeichenfolgen zu vergleichen, die möglicherweise aus verschiedenen Quellen stammen, von denen wir jedoch wissen, dass sie letztendlich dieselben Werte haben - ein Szenario, das für Inline-Zeichenfolgen in unserem Code häufig genug ist. Wenn wir beispielsweise eine Variable mit dem Namenconnection_state
haben und wissen möchten, in welchem der folgenden Zustände['connecting', 'connected', 'disconnecting', 'disconnected']
sie sich gerade befindet, können wir die direkt verwenden===
.Aber es gibt noch mehr. Knapp über 11.9.4 gibt es einen kurzen Hinweis:
Hmm. Was jetzt? Extern erhaltene Saiten können und werden höchstwahrscheinlich eine seltsame Unicodey sein, und unsere Sanftheit
===
wird ihnen nicht gerecht. In kommtlocaleCompare
zur Rettung:Wir können jetzt nach Hause gehen.
tl; dr;
Um Strings in Javascript, verwenden Sie zu vergleichen
localeCompare
; Wenn Sie wissen, dass die Zeichenfolgen keine Nicht-ASCII-Komponenten enthalten, da es sich beispielsweise um interne Programmkonstanten handelt,===
funktioniert dies ebenfalls.quelle
In Ihrer Operation in Ihrer ersten Frage führen Sie die folgende Operation aus:
Angenommen, es handelt sich um Zahlen (dh item1.attr = "1", item2.attr = "2"). Sie können weiterhin den Operator "===" (oder andere strenge Bewerter) verwenden, sofern Sie den Typ sicherstellen. Folgendes sollte funktionieren:
Wenn sie alphaNumerisch sind, verwenden Sie localCompare ().
quelle
Wie sie arbeiten Proben:
quelle
quelle
quelle