在骨干集合中对模型进行排序奇怪的行为

时间:2015-02-15 11:18:40

标签: javascript sorting backbone.js backbone-collections backbone-model

在骨干应用程序中,我能够根据几个属性按升序或降序对模型集合进行排序,其中一个属性是成本。

我正在使用的api奇怪地返回一个字符串的成本(不知道我为什么要投资这个),但是甚至比这更笨的是我可以按成本绝对精细排序,直到成本超过100000.00 - 我不能找出原因。

以下是进行排序的代码,

所以我在集合中设置了隔离区,

comparator: function (item1, item2) {

    var val1 = item1.get(this.sort_key);
    var val2 = item2.get(this.sort_key);
    /***added temporarly to sort save project from modal ****/
    if(val2 == undefined){
        val2 = val1;
    }
    /***end added temporarly to sort save project from modal ****/
    if (typeof (val1) === "string" ) {
        val1 = val1.toLowerCase();
        val2 = val2.toString().toLowerCase();
    }

    var sortValue = val1 > val2 ? 1 : -1;
    return sortValue * this.sort_order;

}

然后我在集合中运行此代码,

this.sort_key = filters.order.by;
    this.sort_order = filters.order.type == "desc" ? -1 : 1;
    // console.log(this.sort_order);
    this.sort();

假设我的值为10000.00,20000.00,30000.00,40000.00和200000.00如果订单升序,我会收到以下内容,

  1. 10000.00
  2. 20000.00
  3. 200000.00
  4. 30000.00
  5. 40000.00
  6. 如果我按顺序排序,我会得到以下返回

    1. 40000.00
    2. 30000.00
    3. 200000.00
    4. 20000.00
    5. 10000.00
    6. 为什么会发生这种情况我无法解决。

1 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为你的排序是字符串而不是数字。

在控制台中使用JavaScript进行操作以查看但是,例如,以下内容将解析为:

"10000000.00" < "400000.00"

更新函数以在比较之前将值解析为整数或浮点数:

comparator: function (item1, item2) {
    var val1Int, val2Int;
    var sortValue = 0;
    var val1 = item1.get(this.sort_key);
    var val2 = item2.get(this.sort_key);
    /***added temporarly to sort save project from modal ****/
    if(val2 == undefined){
        val2 = val1;
    }
    /***end added temporarly to sort save project from modal ****/
    val1Int = parseInt(val1, 10);
    val2Int = parseInt(val2, 10);
    if (val1Int > val2Int) {
        sortValue = 1;
    }
    else if (val1Int < val2Int) {
        sortValue = -1;
    }
    return sortValue * this.sort_order;
}
相关问题