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;
}
}