Конкатенация строк работает нормально при сортировке нескольких полей в порядке возрастания, но у меня это не сработало, потому что 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;
}