Как отсортировать массив хешей по значению в хеше?

120

Этот код Ruby ведет себя не так, как я ожидал:

# create an array of hashes
sort_me = []
sort_me.push({"value"=>1, "name"=>"a"})
sort_me.push({"value"=>3, "name"=>"c"})
sort_me.push({"value"=>2, "name"=>"b"})

# sort
sort_me.sort_by { |k| k["value"]}

# same order as above!
puts sort_me

Я хочу отсортировать массив хэшей по ключу «значение», но они печатаются без сортировки.

Олли Гласс
источник

Ответы:

215

Ruby's sortне выполняет сортировку на месте. (Возможно, у вас есть опыт работы с Python?)

В Ruby есть sort!сортировка на месте, но sort_byв Ruby 1.8 нет варианта на месте . На практике вы можете:

sorted = sort_me.sort_by { |k| k["value"] }
puts sorted

Начиная с Ruby 1.9+, .sort_by!доступны для сортировки на месте:

sort_me.sort_by! { |k| k["value"]}
Стефан Кохен
источник
28
На самом деле, Array#sort_by!это новинка Ruby 1.9.2. Доступен сегодня для всех версий Ruby, требуя также моего backportsдрагоценного камня :-)
Марк-Андре Лафортюн
Привет, а есть ли способ сортировки по убыванию? Думаю, я могу пойти 3,2,1...
tekknolagi
2
Вы не можете этого сделать sort_by, но используйте sortили sort!и просто переверните операнды: a.sort! {|x,y| y <=> x }( ruby-doc.org/core-1.9.3/Array.html#method-i-sort )
Стефан Кочен
1
Или:puts sorted = sort_me.sort_by{ |k,v| v }
Zaz
9
@tekknolagi: Просто добавьте .reverse.
Zaz
21

Согласно @shteef, но реализован с предложенным sort!вариантом:

sort_me.sort! { |x, y| x["value"] <=> y["value"] }
BJG
источник
7

Хотя Ruby не имеет sort_byварианта на месте, вы можете:

sort_me = sort_me.sort_by { |k| k["value"] }

Array.sort_by! был добавлен в 1.9.2

AG_
источник
1
Этот ответ «Array.sort_by! Был добавлен в 1.9.2» у меня сработал
web spider26
2

Вы можете использовать sort_me.sort_by!{ |k| k["value"]}. Это должно сработать.

Мукеш Кумар Гупта
источник