Con Backbone.js tengo una colección configurada con una función de comparación. Está ordenando muy bien los modelos, pero me gustaría invertir el orden.
¿Cómo puedo ordenar los modelos en orden descendente en lugar de ascender?
javascript
backbone.js
Dibujó Dara-Abrams
fuente
fuente
Respuestas:
Bueno, puede devolver valores negativos del comparador. Si tomamos, por ejemplo, el ejemplo del sitio de Backbone y queremos invertir el orden, se verá así:
fuente
Personalmente, no estoy tan contento con ninguna de las soluciones que se dan aquí:
La solución de multiplicar por -1 no funciona cuando el tipo de ordenación no es numérico. Aunque hay formas de evitar esto (llamando,
Date.getTime()
por ejemplo), estos casos son específicos. Me gustaría una forma general de invertir la dirección de cualquier tipo, sin tener que preocuparme por el tipo específico de campo que se está ordenando.Para la solución de cadenas, construir una cadena de un carácter a la vez parece un cuello de botella en el rendimiento, especialmente cuando se utilizan colecciones grandes (o de hecho, cadenas de campos de clasificación grandes)
Aquí hay una solución que funciona muy bien para los campos de cadena, fecha y numérico:
En primer lugar, declare un comparador que revertirá el resultado de un resultado de una función sortBy, como esta:
Ahora, si desea invertir la dirección del ordenamiento, todo lo que tenemos que hacer es:
La razón por la que esto funciona es que se
Backbone.Collection.sort
comporta de manera diferente si la función de clasificación tiene dos argumentos. En este caso, se comporta de la misma manera que el comparador al que se pasóArray.sort
. Esta solución funciona adaptando la función sortBy de un solo argumento en un comparador de dos argumentos e invirtiendo el resultado.fuente
El comparador de colecciones de Backbone.js se basa en el método Underscore.js _.sortBy. La forma en que se implementa sortBy termina "envolviendo" javascript .sort () de una manera que dificulta la clasificación de cadenas en reversa. La simple negación de la cadena termina devolviendo NaN y rompe la clasificación.
Si necesita realizar una ordenación inversa con cadenas, como una ordenación alfabética inversa, aquí hay una forma realmente pirata de hacerlo:
De ninguna manera es bonito, pero es un "negador de cuerdas". Si no tiene ningún reparo en modificar los tipos de objetos nativos en javascript, puede hacer que su código sea más claro extrayendo el negador de cadenas y agregándolo como método en String.Prototype. Sin embargo, probablemente solo desee hacer esto si sabe lo que está haciendo, porque la modificación de los tipos de objetos nativos en javascript puede tener consecuencias imprevistas.
fuente
Mi solución fue revertir los resultados después de ordenarlos.
Para evitar el doble renderizado, primero ordene con silencioso, luego active 'reset'.
fuente
-Date.getTime()
, posiblemente con alguna piratería adicional si cree que las fechas en su sistema cruzarán la época de Unix. Por orden alfabético, mire la respuesta de Andrew anterior.Modifique su función de comparación para devolver un valor proporcional inverso en lugar de devolver los datos que está actualmente. Algún código de: http://documentcloud.github.com/backbone/#Collection-comparator
Ejemplo:
fuente
Lo siguiente funcionó bien para mí:
fuente
Leí en algún lugar que la función del comparador Backbone utiliza o imita la función JavaScript Array.prototype.sort (). Esto significa que utiliza 1, -1 o 0 para decidir el orden de clasificación de cada modelo de la colección. Esto se actualiza constantemente y la colección se mantiene en el orden correcto según el comparador.
Puede encontrar información sobre Array.prototype.sort () aquí: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort?redirectlocale=en-US&redirectslug=JavaScript% 2FReference% 2FGlobal_Objects% 2FArray% 2Fsort
Muchas respuestas a esta pregunta simplemente invierten el orden justo antes de volver a abrirla. Esto no es ideal.
Usando el artículo anterior sobre Mozilla como guía, pude mantener mi colección ordenada en orden inverso usando el siguiente código, luego simplemente representamos la colección en la página en su orden actual y podemos usar una bandera (reverseSortDirection) para invertir el orden .
Comparador excepto los dos modelos, al cambiar la colección o modelo, la función de compartimiento se ejecuta y cambia el orden de la colección.
Probé este enfoque con Numbers and Strings y parece funcionar perfectamente para mí.
Realmente espero que esta respuesta pueda ayudar, ya que he luchado con este problema muchas veces y, por lo general, termino usando una solución alternativa.
fuente
sortKey
yreverseSortDirection
y llamar.sort()
desde cualquier vista que tenga un identificador en la colección. Para mí, es más simple que otras respuestas con más votos.Esto se puede hacer con elegancia anulando el método sortBy. Aquí hay un ejemplo
Entonces puedes usarlo así:
Esta solución no depende del tipo de campo.
fuente
fuente
Aquí hay una solución realmente simple, para aquellos que simplemente quieren cambiar el orden actual. Es útil si tiene una tabla cuyas columnas se pueden ordenar en dos direcciones.
Puede combinarlo con algo como esto si está interesado en el caso de la tabla (coffeescript):
fuente
Para orden inverso en id:
fuente
Tenía un requisito ligeramente diferente, ya que estoy mostrando mis modelos en una tabla y quería poder ordenarlos por cualquier columna (propiedad del modelo) y ya sea ascendente o descendente.
Se ha necesitado una buena cantidad de trabajo para que todos los casos funcionen (donde los valores pueden ser cadenas, cadenas vacías, fechas, números. Sin embargo, creo que esto está bastante cerca.
utilizar:
fuente
Simplemente anulé la función de clasificación para revertir la matriz de modelos al finalizar. También detuve la activación del evento 'sort' hasta que se haya completado el proceso inverso.
fuente
Recientemente me encontré con este problema y simplemente decidí agregar un método rsort.
Ojalá alguien lo encuentre útil.
fuente
Aquí hay una manera rápida y fácil de ordenar de forma inversa los modelos de una colección usando UnderscoreJS
fuente