javascript - 对主干集合中的模型进行排序奇怪的行为

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

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

我使用的 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

如果我按降序排序,我会得到以下返回

  1. 40000.00
  2. 30000.00
  3. 200000.00
  4. 20000.00
  5. 10000.00

为什么会发生这种情况,我无法解决。

最佳答案

发生这种情况是因为您按照字符串而不是数字进行排序。

在控制台中尝试一下 JavaScript 来看看,但例如,以下内容将解析为 true:

"10000000.00" < "400000.00"

更新您的函数以在比较之前将值解析为整数或 float :

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

关于javascript - 对主干集合中的模型进行排序奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28525504/

相关文章:

mysql - 查询数据并按列值返回有序数组

backbone.js - _.bindAll(this) 和 Uncaught TypeError : Cannot read property 'idAttribute' of undefined in backbone-relation. js

javascript - 将 Node 路由与 Backbone 路由绑定(bind)

javascript - 垂直居中高度未知的div

javascript - 如何去除子类别和类别划分之间的空间?

javascript - mousedown 事件可以在循环中间发生吗?

javascript - 按最小长度、最大长度、电子邮件、数字、必需等方式验证表格。angular 2

Java Comparator reversed() 方法有奇怪的结果

c++ - 使用 STL 排序时比较方法问题

backbone.js - 如何让一个 View 知道另一个 View 的变化?