Сортировать массив хэшей - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть этот массив хэшей:

@results = [{:res=>88, :name=>"anna"}, {:res=>39, :name=>"dan"}, {:res=>39, :name=>"cain"}, {:res=>33, :name=>"billy"}]

Я пытаюсь отсортировать его по результату, затем имя:

@results.sort_by!{ |h| [h.res, h.name] }.reverse!

И я получаю эту ошибку:

undefined method `res' for {:res=>39, :name=>"cain"}:Hash

Любые идеи, пожалуйста.

Ответы [ 4 ]

0 голосов
/ 22 ноября 2018

Вы можете использовать Enumerable # max_by (с аргументом).

@results.max_by(@results.size) { |h| h.values_at(:res, :name) }
  #=> [{:res=>88, :name=>"anna"}, {:res=>39, :name=>"dan"},
  #    {:res=>39, :name=>"cain"}, {:res=>33, :name=>"billy"}]
0 голосов
/ 22 ноября 2018

Это также делает то же самое:

@results = [{:res=>88, :name=>"anna"}, {:res=>39, :name=>"dan"}, {:res=>39, :name=>"cain"}, {:res=>33, :name=>"billy"}]
@results.sort_by! { |h| h[:res] }
0 голосов
/ 22 ноября 2018

Пересеките параметры условия, чтобы отсортировать по имени в обратном направлении:

results.sort{ |h1, h2| [h2[:res], h2[:name]] <=> [h2[:res], h2[:name]] }
#=> [{:res=>88, :name=>"anna"}, {:res=>39, :name=>"dan"}, {:res=>39, :name=>"cain"}, {:res=>33, :name=>"billy"}, {:res=>33, :name=>"al"}]


results.sort{ |h1, h2| [h2[:res], h1[:name]] <=> [h1[:res], h2[:name]] }
#=> [{:res=>88, :name=>"anna"}, {:res=>39, :name=>"cain"}, {:res=>39, :name=>"dan"}, {:res=>33, :name=>"al"}, {:res=>33, :name=>"billy"}]
0 голосов
/ 22 ноября 2018

В отличие от JavaScript, вы не можете вызвать h.res для хэша, чтобы получить res значение.Вы должны сделать это, используя оператор []:

@results.sort_by! { |h| [h[:res], h[:name]] }.reverse!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...