Com Backbone.js , tenho uma coleção configurada com uma função de comparação. É uma boa classificação dos modelos, mas gostaria de inverter a ordem.
Como posso classificar os modelos em ordem decrescente em vez de crescente?
javascript
backbone.js
Drew Dara-Abrams
fonte
fonte
Respostas:
Bem, você pode retornar valores negativos do comparador. Se pegarmos, por exemplo, o exemplo do site do Backbone e quisermos inverter a ordem, ficará assim:
fonte
Pessoalmente, não estou muito satisfeito com nenhuma das soluções fornecidas aqui:
A solução de multiplicação por -1 não funciona quando o tipo de classificação não é numérico. Embora existam maneiras de contornar isso (ligando,
Date.getTime()
por exemplo), esses casos são específicos. Gostaria de uma maneira geral de inverter a direção de qualquer tipo, sem ter que me preocupar com o tipo específico de campo que está sendo classificado.Para a solução de string, construir uma string com um caractere por vez parece um gargalo de desempenho, especialmente ao usar grandes coleções (ou mesmo, grandes strings de campo de classificação)
Esta é uma solução que funciona bem para campos String, Date e Numérico:
Em primeiro lugar, declare um comparador que reverterá o resultado de um resultado de uma função sortBy, assim:
Agora, se você quiser inverter a direção da classificação, tudo o que precisamos fazer é:
O motivo pelo qual isso funciona é que
Backbone.Collection.sort
se comporta de maneira diferente se a função de classificação tiver dois argumentos. Nesse caso, ele se comporta da mesma maneira que o comparador passou paraArray.sort
. Essa solução funciona adaptando a função sortBy de argumento único em um comparador de dois argumentos e revertendo o resultado.fonte
O comparador de coleção do Backbone.js conta com o método _.sortBy de Underscore.js. A forma como o sortBy é implementado acaba "envolvendo" o javascript .sort () de uma forma que torna difícil a classificação reversa das strings. A simples negação da string acaba retornando NaN e quebra a classificação.
Se você precisar realizar uma classificação reversa com Strings, como uma classificação alfabética reversa, aqui está uma maneira realmente hack de fazer isso:
Não é nada bonito, mas é um "negador de strings". Se você não tiver nenhum escrúpulo em modificar os tipos de objeto nativos em javascript, poderá tornar seu código mais claro extraindo o negador de string e adicionando-o como um método em String.Prototype. No entanto, você provavelmente só deseja fazer isso se souber o que está fazendo, porque modificar os tipos de objetos nativos em javascript pode ter consequências imprevistas.
fonte
Minha solução foi reverter os resultados após a classificação.
Para evitar a renderização dupla, primeiro classifique com silencioso e, em seguida, acione 'reset'.
fonte
-Date.getTime()
, possivelmente com algum hacking extra se você acredita que as datas em seu sistema irão cruzar a época unix. Para a ordem alfabética, veja a resposta de Andrew acima.Modifique sua função de comparador para retornar algum valor proporcional inverso em vez de retornar os dados que você está atualmente. Algum código de: http://documentcloud.github.com/backbone/#Collection-comparator
Exemplo:
fonte
O seguinte funcionou bem para mim:
fonte
Eu li alguns em que a função de comparador de Backbone usa ou imita a função JavaScript Array.prototype.sort (). Isso significa que ele usa 1, -1 ou 0 para decidir a ordem de classificação de cada modelo na coleção. Isso é atualizado constantemente e a coleção permanece na ordem correta com base no comparador.
Informações sobre Array.prototype.sort () podem ser encontradas aqui: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort?redirectlocale=en-US&redirectslug=JavaScript% 2FReference% 2FGlobal_Objects% 2FArray% 2Fsort
Muitas respostas a essa pergunta simplesmente invertem a ordem antes de enviá-la para a página. Isso não é ideal.
Usando o artigo acima no Mozilla como guia, consegui manter minha coleção classificada em ordem reversa usando o código a seguir, então simplesmente renderizamos a coleção na página em sua ordem atual e podemos usar um sinalizador (reverseSortDirection) para inverter a ordem .
Comparador exceto dois modelos, nas alterações na coleção ou no modelo, a função de compartimento executa e altera a ordem da coleção.
Eu testei essa abordagem com Numbers e Strings e parece estar funcionando perfeitamente para mim.
Eu realmente espero que esta resposta possa ajudar, já que lutei com esse problema muitas vezes e geralmente acabo usando uma solução alternativa.
fonte
sortKey
ereverseSortDirection
e chamada.sort()
a partir de qualquer ponto de vista que tem uma alça sobre a coleção. Mais simples do que outras respostas com maior votação, para mim.Isso pode ser feito elegantemente substituindo o método sortBy. Aqui está um exemplo
Então você pode usá-lo assim:
Esta solução não depende do tipo de campo.
fonte
fonte
Aqui está uma solução realmente simples, para aqueles que simplesmente desejam inverter o pedido atual. É útil se você tiver uma tabela cujas colunas podem ser ordenadas em duas direções.
Você pode combiná-lo com algo assim se estiver interessado no caso da mesa (coffeescript):
fonte
Para ordem reversa no id:
fonte
Eu tinha um requisito um pouco diferente, no sentido de que estou exibindo meus modelos em uma tabela e queria poder classificá-los por qualquer coluna (propriedade do modelo) e ascendente ou descendente.
Demorou bastante para fazer todos os casos funcionarem (onde os valores podem ser strings, strings vazias, datas, números. No entanto, acho que isso está bem próximo.
usar:
fonte
Acabei de substituir a função de classificação para reverter a matriz de modelos após a conclusão. Também evitei o acionamento do evento 'sort' até que o reverso fosse concluído.
fonte
Recentemente tive esse problema e decidi adicionar um método rsort.
Espero que alguém ache isso útil
fonte
Esta é uma maneira rápida e fácil de reverter a classificação dos modelos de uma coleção usando UnderscoreJS
fonte