Eu tenho uma matriz de objetos em Ruby on Rails. Eu quero classificar a matriz por um atributo do objeto. É possível?
128
Eu recomendo usar sort_by:
objects.sort_by {|obj| obj.attribute}
Especialmente se o atributo puder ser calculado.
Ou uma abordagem mais concisa:
objects.sort_by(&:attribute)
objects.sort_by(&:attribute)
objects.sort_by { |obj| obj.attribute.downcase }
sort!
(por exemplo, velocidade, etc.)?Sim,
Array#sort!
é fácil usar isso.fonte
<=>
? Que tipo de erros você está recebendo? etc, etc, ad nauseum. Em outras palavras, precisamos de mais detalhes do que "mas sem sorte para mim".sort
se desejar preservar o original e atribuir o resultado a um objeto diferente; caso contrário, use a variante no localsort!
,. De fato,sort
chamasort!
internamente, depois de copiar o objeto original.sort!
irá funcionar bem e sempre (!) Fará a mesma coisa que você escreveu.Ordem ascendente :
ou
Ordem decrescente :
ou
fonte
caso você precise classificar por dois atributos, onde o primeiro é mais importante que o segundo (significa considerar os segundos argumentos apenas se os primeiros argumentos forem iguais), faça o seguinte
ou no caso de matriz de matrizes
fonte
Você pode classificar qualquer classe substituindo o método <=>:
Agora, uma matriz de objetos Pessoa poderá ser classificada em last_name.
fonte
A matriz # sort funciona bem, conforme publicado acima:
MAS, você precisa garantir que o
<=>
operador esteja implementado para esse atributo. Se for um tipo de dados nativo do Ruby, isso não é um problema. Caso contrário, escreva sua própria implementação que retornará -1 se a <b, 0 se forem iguais e 1 se a> b.fonte
Mais elegante
objects.sort_by(&:attribute)
, você pode adicionar um.reverse
se precisar alterar o pedido.fonte
Sim é possivel
http://ariejan.net/2007/01/28/ruby-sort-an-array-of-objects-by-an-attribute/
fonte
fonte
sort
ao classificar objetos que não podem ser comparados diretamente. Se você precisar acessar atributos ou fazer um cálculo para obter o valor para comparar o usosort_by
. Será muito mais rápido.