Если вы работаете с нечисловыми значениями, не существует очевидного способа сделать обратную сортировку. Backbone использует методы _.sortBy()
и _.sortedIndex()
от Underscore для упорядочивания моделей на основе компаратора, и эти методы автоматически сортируются в порядке возрастания. Наивный способ сделать это - использовать chapters.pluck('title').reverse()
, в результате pluck
будет массивом. Но вызов reverse
для некоторых методов Collection приведет к изменению моделей Collection на месте, поэтому при следующем вызове модели вернутся в порядке возрастания. Вы всегда можете сделать что-то вроде:
var results = [],
titles = chapters.pluck('title');
for(var i=0, len=titles.length; i<len; i++) {
results.push(titles[i]);
}
results.reverse();
Это не повлияет на массив моделей в вашей коллекции Backbone, так как это создаст совершенно новый массив результатов в памяти, но сохранит ссылки на исходные модели, поэтому при вызове таких вещей, как save
, все равно будет обновлено состояние Collection.
Но это не очень элегантно и создает много дополнительного кодирования в вашем проекте в любое время, когда вы захотите обратить вспять результаты. Я думаю, что мы можем сделать лучше.
Чтобы сделать эту работу, вам нужно выполнить немного громоздкий ниджалир JavaScript в вашем методе сравнения, чтобы сделать эту работу - обратите внимание, что это не проверено:
chapters.comparator = function(chapter) {
var alphabet = '0123456789abcdefghijklmnopqrstuvwxyz',
title = chapter.get('title').toLowerCase(),
inverse_title = '',
index;
for(var i=0, len=title.length; i<len; i++) {
index = alphabet.indexOf(title.charAt(i));
if(index === -1) {
inverse_title += title.charAt(i);
continue;
}
inverse_title += alphabet.charAt(alphabet.length - index - 1);
}
return inverse_title;
};
Эта концепция, вероятно, нуждается в улучшении, чтобы учесть символы и т. Д., Но по существу она инвертирует строку компаратора таким образом, что "Z" становится "0", "Y" становится "1" и т. Д., Что должно произвести обратную сортировку, которую вы ищете.