使用Backbone.js,我得到了一个带有比较器函数的集合。它很好地对模型进行了排序,但我想颠倒顺序。
如何按降序而不是升序对模型进行排序?
发布于 2011-02-16 16:23:51
嗯,你可以从比较器返回负值。例如,如果我们以Backbone的站点为例,并希望颠倒顺序,它将如下所示:
var Chapter = Backbone.Model;
var chapters = new Backbone.Collection;
chapters.comparator = function(chapter) {
return -chapter.get("page"); // Note the minus!
};
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'));
发布于 2011-05-01 12:20:13
‘s的集合比较器依赖于Underscore.js方法_.sortBy。sortBy的实现方式最终“包装”了javascript .sort(),这使得反向排序字符串变得很困难。对字符串进行简单的否定操作会返回NaN并破坏排序。
如果您需要对字符串执行反向排序,例如按字母顺序反向排序,这里有一种非常老套的方法:
comparator: function (Model) {
var str = Model.get("name");
str = str.toLowerCase();
str = str.split("");
str = _.map(str, function(letter) {
return String.fromCharCode(-(letter.charCodeAt(0)));
});
return str;
}
它一点也不漂亮,但它是一个“字符串负值器”。如果你对在javascript中修改原生对象类型没有任何顾虑,你可以通过提取字符串求反器并将其作为一个方法添加到String.Prototype中来使你的代码更清晰。然而,您可能只在知道自己在做什么的情况下才想这样做,因为在javascript中修改原生对象类型可能会产生不可预见的后果。
发布于 2011-09-06 03:15:00
我的解决方案是在排序后反转结果。
为了防止双重渲染,首先使用静默进行排序,然后触发“reset”。
collections.sort({silent:true})
collections.models = collections.models.reverse();
collections.trigger('reset', collections, {});
https://stackoverflow.com/questions/5013819
复制相似问题