我需要按降序排列有两列的集合,但是第一列考虑第一列的顺序,然后是第二列,一列只是一个标志(0' s和1' s)和另一个包含日期,我想以这样的方式对数据进行排序
1,5,20/2014
1,5 / 15/2014
0,5 / 30/2014
0,5 / 25/2014
0,4 / 11/2014
这是我的代码看起来像,但不起作用,我不知道我做错了什么。
extendCollection: function(Collection) {
_.extend(Collection.prototype, {
comparator : function( model ) {
var dateCreated = new Date(model.get('dateCreated')).getTime();
return model.get('isFavorited') > dateCreated ? -1 : 1;
}
});
return Collection;
}
答案 0 :(得分:2)
来自fine manual:
比较器
collection.comparator
[...]比较器可以定义为 sortBy (传递一个带有单个参数的函数),作为 sort (传递一个需要两个参数的比较器函数) ),或作为指示要排序的属性的字符串。
请注意,比较器可以采用两个参数。如果你使用两个参数comparator
,那么逻辑很简单:
comparator: function(a, b) {
var a_fav, b_fav, a_date, b_date;
a_fav = a.get('isFavorited');
b_fav = b.get('isFavorited');
if(a_fav > b_fav)
return -1;
if(a_fav < b_fav)
return 1;
a_date = new Date(a.get('dateCreated'));
b_date = new Date(b.get('dateCreated'));
if(a_date > b_date)
return -1;
if(a_date < b_date)
return 1;
return 0;
}
不需要奇怪的映射hackery或废话,只需简单明了的比较逻辑。在处理多个排序键,反向字符串排序和其他非平凡的排序任务时,您几乎总是使用Array.prototype.sort
- 样式两个参数comparator
。
如果您在parse
方法中将dateCreated
字符串属性转换为真实的Date
个实例,并且在设置新值时,情况会更简单。
答案 1 :(得分:-1)
这有点像黑客,但这应该做的工作:
return -model.get("isFavorited") * Math.pow(10, 20) - dateCreated
感谢下面的更正。