La concatenación de cadenas funciona bien al ordenar múltiples campos en orden ascendente, pero no funcionó porque 1) tuve que soportar asc/desc por campo y 2) ciertos campos eran campo de número (es decir, quiero 10 para venir después de 2 si está ascendiendo). Entonces, a continuación, una función de comparación que utilicé y funcionó bien para mis necesidades. Asume que la colección principal tiene una variable asignada con 'sortConfig', que es una matriz de objetos JSON con el nombre del campo y la dirección del orden de clasificación. Por ejemplo,
{
"sort" : [
{
"field": "strField",
"order": "asc"
},
{
"field": "numField",
"order": "desc"
},
...
]
}
Con el objeto JSON anteriormente asignado como 'sortConfig' a la colección, la función a continuación hará Backbone ordenar por strField en orden ascendente primero, a continuación, ordenar por NumField en orden descendente, etc. Si no hay se especifica el orden de clasificación, ordena de forma ascendente por defecto.
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;
}
Compatibilidad con los comparadores de estilo de clasificación desde principios de 2012. Solo acepte 2 argumentos y devuelva -1, 0 o 1. https: // github.com/documentcloud/backbone/commit/6b3ff7b0359510917d9ead8c8e16a7457eef05ef – geon