Странное поведение сортировки моделей в базовой коллекции

В магистральном приложении у меня есть возможность сортировать коллекцию моделей в порядке возрастания или убывания на основе пары атрибутов, одним из которых является стоимость.

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

Почему это происходит, я не могу понять.


person Udders    schedule 15.02.2015    source источник
comment
Просто небольшой вопрос, но происходит ли это, когда вы сначала конвертируете в число?   -  person Max Langerak    schedule 15.02.2015


Ответы (1)


Это происходит потому, что вы сортируете как строки, а не числа.

Поэкспериментируйте с JavaScript в своей консоли, чтобы увидеть, но, например, следующее будет разрешено true:

"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;
}
person timothyclifford    schedule 15.02.2015
comment
Ах, хорошо, некоторое время не использовал Backbone... Обновленный ответ на основе ваших комментариев, спасибо - person timothyclifford; 16.02.2015