如何在Backbone.js / underscore.js中的比较器中实现多级排序?

时间:2012-02-08 20:49:25

标签: javascript backbone.js underscore.js

想象一下Model / Collection,如:

var AModel = Backbone.Model.extend({
    defaults: {
        a: 'a string',
        b: 'another string',
        c: 'yet another string'
    }
});

var ACollection = Backbone.Collection.extend({
    model: AModel,
    comparator: function(amodel) {
        ...
    }
});

如何编写比较器来实现多级排序?我想按AModel的{​​{1}}属性排序,然后按a属性排序,再按b属性排序。

我已经将一个看起来像这样的比较器一起攻击,但我想知道是否有更好/更聪明的方式?

c

然后,comparator: function(amodel) { var s = '', assumed_max_length_of_any_attribute = 30; s += amodel.get('a'); while (s.length < assumed_max_length_of_any_attribute) { s += ' '; } s += amodel.get('b'); while (s.length < assumed_max_length_of_any_attribute) { s += ' '; } s += amodel.get('c'); while (s.length < assumed_max_length_of_any_attribute) { s += ' '; } return s; } 被正确填充空格,并且应该是具有多个级别的“词汇”顺序。但是,与python稳定的多级排序之类相比,这一切都感觉非常粗糙(如果不知何故,以上在python中有类似的等价物):

s

有更好的方法吗?

1 个答案:

答案 0 :(得分:8)

主干文档说:

  

比较器功能可以定义为sortBy(传递函数)   采用单个参数),或作为排序(传递比较器   需要两个参数的函数。)

http://documentcloud.github.com/backbone/#Collection-comparator

您可以使用第二种方式,并根据给定的两个元素实施比较。

也许是这样的:

helper: function (c1, c2) {
    if (c1 < c2) return -1;
    if (c1 > c2) return +1;
    return 0;
}
comparator: function (model1, model2) {
    return _.reduce(["c", "b", "a"], function (acc, comp) {
        return acc !== 0 ? acc : this.helper(model1[comp], model2[comp])
    }, 0);
}