Строка конкатенации прекрасно работает при сортировке нескольких полей в порядке возрастания, но это не сработало для меня, потому что 1) мне пришлось поддерживать asc/desc на поле и 2) определенные поля были полем числа (то есть, я хочу 10 приходить после 2, если он восходит). Итак, ниже была функция компаратора, которую я использовал и работал нормально для моих нужд. Предполагается, что у базовой системы есть переменная, назначенная с помощью 'sortConfig', которая представляет собой массив объектов JSON с именем поля и порядком порядка сортировки. Например,
{
"sort" : [
{
"field": "strField",
"order": "asc"
},
{
"field": "numField",
"order": "desc"
},
...
]
}
С объекта JSON выше назначен «sortConfig» в коллекции, функция ниже будет делать Backbone сортировать по strField в порядке возрастания, а затем сортировать по numField в порядке убывания, и т.д. Если нет порядок сортировки указан, сортировка по умолчанию возрастает.
multiFieldComparator: function(one, another) {
// 'this' here is Backbone Collection
if (this.sortConfig) {
for (var i = 0; i < this.sortConfig.length; i++) {
if (one.get(this.sortConfig[i].field) > another.get(this.sortConfig[i].field)) {
return ("desc" != this.sortConfig[i].order) ? 1 : -1;
} else if (one.get(this.sortConfig[i].field) == another.get(this.sortConfig[i].field)) {
// do nothing but let the loop move further for next layer comparison
} else {
return ("desc" != this.sortConfig[i].order) ? -1 : 1;
}
}
}
// if we exited out of loop without prematurely returning, the 2 items being
// compared are identical in terms of sortConfig, so return 0
// Or, if it didn't get into the if block due to no 'sortConfig', return 0
// and let the original order not change.
return 0;
}
С начала 2012 года поддерживается поддержка сортировочных компараторов. Просто примите 2 аргумента и верните -1, 0 или 1. https: // github.com/documentcloud/backbone/commit/6b3ff7b0359510917d9ead8c8e16a7457eef05ef – geon