Javascript 根据三个模型属性对主干集合进行排序

Javascript 根据三个模型属性对主干集合进行排序,javascript,sorting,backbone.js,Javascript,Sorting,Backbone.js,我查看了一个模型属性,如示例所示,排序工作正常。但是,我想对多个属性进行排序,下面的帖子建议可以对多个属性进行排序: 我能够按照上面示例中的建议对两个属性进行排序,但是,如果我添加了一个附加属性(第三个属性),排序就不能对第三个属性进行排序 有人能解释为什么这适用于一个和两个属性,但不适用于三个属性吗 下面是我如何定义比较器的: var aCollection = Backbone.Collection.extend({ model: Model, comparator: fu

我查看了一个模型属性,如示例所示,排序工作正常。但是,我想对多个属性进行排序,下面的帖子建议可以对多个属性进行排序:

我能够按照上面示例中的建议对两个属性进行排序,但是,如果我添加了一个附加属性(第三个属性),排序就不能对第三个属性进行排序

有人能解释为什么这适用于一个和两个属性,但不适用于三个属性吗

下面是我如何定义比较器的:

var aCollection = Backbone.Collection.extend({
    model: Model,
    comparator: function(item){
      return [item.get('uid'), item.get('vid'), item.get('wid')];
    },
    ...
});

为了清楚起见,我使用的是带有主干的require.js。为了解决这个问题,我做了大量的谷歌搜索,然后尝试了以下方法,效果很好。在加载我的集合时,我创建了一个
comparator
函数,它接受两个参数。例如:

比较器:函数(a,b){ 变量字段=['uid','vid','wid'], 方向=['asc','asc','asc'], cmpOn; cmpOn=u2;.find(字段,函数(c){ 返回a.attributes[c]!=b.attributes[c]; }); 如果(!cmpOn)返回0; if((方向[u.indexOf(字段,cmpOn)]| |“asc”).toLowerCase()==“asc”){ 返回a.attributes[cmpOn]>b.attributes[cmpOn]?1:-1; }否则{ 返回a.attributes[cmpOn]您引用的答案完全错误,只能在偶然情况下使用,请忽略它。如果要按多个属性排序,请使用双参数
比较器
(其行为类似于传递给的
比较器
函数),并手动进行逐属性比较。@muistooshort感谢您的反馈。我需要从经验丰富的开发人员那里知道这个解决方案是合适的,所以我现在会研究你的建议。hyong对这个问题的回答比(遗憾的)被普遍接受的答案要好得多。真遗憾,这么多人在不理解答案的情况下投票。@muistoshort我同意,特别是当你来这里澄清问题,结果却被引导到错误的方向时。
var aCollection = Backbone.Collection.extend({
    model: Model,
    comparator: function(item){
      return [item.get('uid'), item.get('vid'), item.get('wid')];
    },
    ...
});
comparator: function(a, b){

var fields = ['uid','vid','wid'],
            directions = ['asc', 'asc', 'asc'],
            cmpOn;

        cmpOn = _.find(fields, function(c){
           return a.attributes[c] != b.attributes[c];
        });

        if(!cmpOn) return 0;

        if ( ( directions[_.indexOf( fields, cmpOn )] || 'asc' ).toLowerCase() == 'asc' ) {
            return a.attributes[cmpOn] > b.attributes[cmpOn] ? 1 : -1;
        } else {
            return a.attributes[cmpOn] < b.attributes[cmpOn] ? 1 : -1;
        }

}