排序集合与两列首先由一列,然后由第二列在Backbone.js

Sort collection with two columns first by one column and then by the second one in Backbone.js

本文关键字:然后 二列 js Backbone 一列 两列 集合 排序      更新时间:2023-09-26

我需要按降序排序一个有两列的集合,但首先考虑第一列的顺序,然后是第二列,一列只是一个标志(0和1),另一列包含日期,我想以一种方式排序数据,显示如下

2014年5月20日 2014年5月15日

2014/5/30

2014/5/25

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

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

不需要奇怪的映射技巧或无意义的东西,只需要简单清晰的比较逻辑。在处理多个排序键、反向字符串排序和其他重要排序任务时,您几乎总是使用Array.prototype.sort风格的两个参数comparator

如果您在parse方法中将dateCreated字符串属性转换为真实的Date实例,并且在设置新值时,事情会更简单。

这是一个hack,但应该做的工作:

return -model.get("isFavorited") * Math.pow(10, 20) - dateCreated

感谢下面的更正