如果你正在处理非数字值,那么没有明显的方法来进行逆序排序。Backbone使用Underscore的
_.sortBy()
和
_.sortedIndex()
方法基于比较器对模型进行排序,这些方法自动按升序排序。最朴素的方法是使用
chapters.pluck('title').reverse()
,因为
pluck
的结果将是一个数组。但是,在一些集合方法上调用
reverse
会就地反转集合模型,所以下次再调用它时,模型将回到升序状态。你可以像这样做:
var results = [],
titles = chapters.pluck('title');
for(var i=0, len=titles.length; i<len; i++) {
results.push(titles[i]);
}
results.reverse();
这不会影响你Backbone集合中的models数组,因为它会在内存中创建一个全新的results数组,但保留对原始models的引用,因此调用像save
这样的方法仍将更新集合状态。
但这并不是非常优雅的解决方案,在项目中每次想要反转结果时都需要编写大量额外的代码。我认为我们可以做得更好。
为了使其正常工作,您需要在比较器方法中执行一些笨拙的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”等等,这应该可以产生您想要的反向排序。