Tri de chaînes dans l'ordre inverse avec backbone.js
Je suis en train de trier un Backbone.js collection dans l'ordre inverse. Il y a des précédentes réponses sur la façon de le faire qu'avec des entiers, mais aucun avec des chaînes.
var Chapter = Backbone.Model;
var chapters = new Backbone.Collection;
chapters.comparator = function(chapter) {
return chapter.get("title");
};
chapters.add(new Chapter({page: 9, title: "The End"}));
chapters.add(new Chapter({page: 5, title: "The Middle"}));
chapters.add(new Chapter({page: 1, title: "The Beginning"}));
alert(chapters.pluck('title'));
Le code ci-dessus trie les chapitres de Un -> Z, mais comment puis-je écrire un comparateur qui trie de Z -> Un?
- L'exemple est à partir de la documentation: documentcloud.github.com/backbone/#Collection-comparator - avec "titre" au lieu de "page" à l'intérieur de l'élément de comparaison.
- double possible de inverser l'ordre de tri avec Backbone.js
- Pas un doublon, la question diffère sur la nécessité de trier les chaînes au lieu de numéros, ce qui ne peut être fait avec le signe moins, comme l'a suggéré à l'autre question.
- Voici une solution qui permettra d'inverser le sens de tout sortBy comparateur, quel que soit le type: stackoverflow.com/questions/5013819/...
Vous devez vous connecter pour publier un commentaire.
Il existe deux versions de l'comparateur de fonction que vous pouvez utiliser, soit la sortBy version qui a été montré dans l'exemple, ce qui prend un paramètre, ou sorte - vous pouvez y revenir plus standard de la fonction de tri de l' la documentation dit:
Donc dans ce cas, nous pouvons écrire un autre comparateur de fonction:
De sorte que vous devriez obtenir une réponse:
Vous pouvez:
0xffff
(le maximum de la valeur de retour destring.charCodeAt
),String.fromCharCode
de tourner en arrière dans la chaîne de "annulé" caractèreset qui sera votre clé de tri.
Et le tour est joué:
Remarque: si votre comparaison de chaînes sont longues (comme dans 65 ko ou plus), vous risquez de rencontrer des problèmes (voir Matt commentaire ci-dessous). Pour éviter cela, et d'accélérer les comparaisons un peu, il suffit d'utiliser une courte tranche de votre comparaison de chaîne de caractères. (Dans l'exemple ci-dessus, vous pourrait aller pour
chapter.get("title").slice(0, 100).split("")
à la place.) Combien de temps une tranche dont vous avez besoin dépend de votre application.fromCharCode.apply
serait un lock-up Safari lorsqu'il est appelé avec de très longs tableaux. Un tableau avec une longueur de plus de 65536 serait la cause d'échouer complètement, et de jeter un RangeError. Peut-être ce comparateur de fonction peut être plus sûre (et potentiellement plus efficace) par l'extraction d'une tranche de la premièren
caractères à partir de la comparaison de chaîne de caractères.foo
etfoobar
n'est pas inversée. Cela peut être essentiellement résolu en ajoutantString.fromCharCode(0xffff)
à la fin de la chaîne.Si vous travaillez avec des valeurs non numériques, il n'est pas évident de faire un tri inverse. Épine dorsale rend l'utilisation de la
_.sortBy()
et_.sortedIndex()
méthodes de trait de Soulignement pour commander les modèles basés sur le comparateur, et ces méthodes de trier automatiquement dans l'ordre croissant. Le naïf façon de le faire serait d'utiliserchapters.pluck('title').reverse()
, comme le résultat depluck
sera un tableau. Mais l'appel dereverse
sur certaines méthodes de Collecte permettra d'inverser la Collection des modèles en place, alors la prochaine fois que vous l'appelez, les modèles seront de retour dans l'ordre croissant. Vous pouvez toujours faire quelque chose comme:Cela n'aurait pas d'incidence sur les modèles de tableau dans votre épine Dorsale de la collection, car elle permettrait de créer un tout nouveau les résultats de tableau dans la mémoire, mais conserver les références aux modèles originaux, donc appeler les choses comme
save
serait encore de mise à jour de la Collection de l'état.Mais ce n'est pas très élégant, et crée beaucoup de codage supplémentaire tout au long de votre projet en tout temps que vous souhaitez inverser les résultats. Je pense que nous pouvons faire mieux.
Pour faire ce travail, vous aurez besoin d'effectuer un peu de lourd JavaScript ninjary dans votre méthode de comparaison à faire ce travail - notez ce n'est pas testée:
Ce concept sans doute besoin d'être amélioré pour prendre en compte les symboles, etc., mais, essentiellement, il inverse le comparateur de chaîne de telle façon que les "Z" devient "0", "Y" devient "1", etc., ce qui devrait aboutir à l'inverse de sorte que vous êtes après.
Comme épine Dorsale utilise simplement la .sortBy méthode, il suffit de proxy dans votre propre logique:
..ou l'ajouter quelque part d'autre..
Je viens de résoudre un problème similaire avec table de tri et j'ai voulu partager le code car je n'ai pas trouvé beaucoup d'aide dans ces réponses:
dans ce cas, j'ai tout simplement mis de comparaison de chaîne au lieu d'une fonction; la chaîne doit être le nom de la propriété que vous souhaitez trier.
Je viens d'appeler l'arrière sur les modèles si la commande doit être inverse.
Juste ajouter moins avant
chapter.get