У меня есть массив объектов в Ruby on Rails. Я хочу отсортировать массив по атрибуту объекта. Является ли это возможным?
129
Вместо этого я рекомендую использовать sort_by:
objects.sort_by {|obj| obj.attribute}
Особенно, если атрибут можно вычислить.
Или более лаконичный подход:
objects.sort_by(&:attribute)
objects.sort_by(&:attribute)
objects.sort_by { |obj| obj.attribute.downcase }
sort!
(например, скорость и т. Д.)?Да, использовать
Array#sort!
это просто.источник
<=>
? Какие ошибки вы получаете? и т. д. и т. д. до тошноты. Другими словами, нам нужно больше деталей, чем «но мне не повезло».sort
если хотите сохранить оригинал и присвоить результат другому объекту; в противном случае используйте вариант в месте,sort!
. Фактически,sort
вызываетsort!
внутренний вызов после копирования исходного объекта.sort!
будет работать нормально и всегда (!) Делать то же самое, что вы написали.По возрастанию:
или
В порядке убывания :
или
источник
если вам нужна сортировка по двум атрибутам, где первый важнее, затем второй (означает учет вторых аргументов, только если первые аргументы равны), тогда вы можете сделать это
или в случае массива массивов
источник
Вы можете сделать любой класс сортируемым, переопределив метод <=>:
Теперь массив объектов Person можно будет отсортировать по last_name.
источник
Array # sort работает хорошо, как указано выше:
НО, вам нужно убедиться, что
<=>
оператор реализован для этого атрибута. Если это собственный тип данных Ruby, это не проблема. В противном случае напишите собственную реализацию, которая возвращает -1, если a <b, 0, если они равны, и 1, если a> b.источник
Более элегантно
objects.sort_by(&:attribute)
, вы можете добавить,.reverse
если вам нужно изменить порядок.источник
Да это возможно
http://ariejan.net/2007/01/28/ruby-sort-an-array-of-objects-by-an-attribute/
источник
источник
sort
при сортировке объектов, которые нельзя сравнивать напрямую. Если вам нужно получить доступ к атрибутам или выполнить вычисление, чтобы получить значение для сравнения, используйтеsort_by
. Будет намного быстрее.