Як сортувати масив хешів за значенням у хеші?


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

Рубі sortне сортує на місці. (Мабуть, у вас Python-фон, можливо?)

Ruby sort!призначений для сортування на місці, але для sort_byRuby 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дорогоцінного каміння :-)
Marc-André Lafortune

Привіт, чи існує спосіб сортування у порядку зменшення? Я думаю, що я, можливо, захочу поїхати 3,2,1...
teknonogi

2
Ви не можете зробити це з sort_by, але використання sortабо sort!і просто перевертати операнди: a.sort! {|x,y| y <=> x }( ruby-doc.org/core-1.9.3/Array.html#method-i-sort )
Stéphan Kochen

1
Або:puts sorted = sort_me.sort_by{ |k,v| v }
Заз

9
@tekknolagi: Просто додати .reverse.
Заз

21

Відповідно до @shteef, але реалізовано з запропонованим sort!варіантом:

sort_me.sort! { |x, y| x["value"] <=> y["value"] }

7

Хоча у Ruby немає sort_byваріанту на місці, ви можете:

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

Array.sort_by! додано в 1.9.2


1
Ця відповідь "Array.sort_by! Була додана в 1.9.2" працювала для мене
веб-павук26

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.