Я пытался выяснить, как использовать методы max_by
и max
с несколькими условиями. В то время как я думал, что сделал, после обширного тестирования оказалось, что это не так.
Например, у меня есть хэш, значения которого являются хешами:
chapters = { "686050": {
"volume": '1',
"chapter": '1',
"title": 'Chapter Title',
"lang_code": 'gb',
"timestamp": 1_565_434_815
},
"686049": {
"volume": '2',
"chapter": '1',
"title": 'Chapter Title',
"lang_code": 'gb',
"timestamp": 1_565_300_815
},
"686048": {
"volume": '2',
"chapter": '2',
"title": 'Chapter Title',
"lang_code": 'gb',
"timestamp": 1_565_300_815
}
}
Я хочу найти одинхэш, который имеет максимальную громкость и главу. Так что в этом случае я ожидаю получить ту с томом 2 и главой 2.
Моя первая реализация использовала max
:
chapters.max do |a, b|
a[1][:volume].to_d <=> b[1][:volume].to_d &&
a[1][:chapter].to_d <=> b[1][:chapter].to_d
end
При взгляде на это мое мышлениебыло то, что сначала будет сравниваться по объему, а затем по главе. Этот код работал ... пока я не изменил хеш на:
"686050": {
"volume": '1',
"chapter": '1',
"title": 'Chapter Title',
"lang_code": 'gb',
"timestamp": 1_565_434_815
},
"686049": {
"volume": '2',
"chapter": '1',
"title": 'Chapter Title',
"lang_code": 'gb',
"timestamp": 1_565_300_815
}
Который неожиданно начал возвращать тот, что с томом 1 и главой 2! Я до сих пор не уверен, почему это происходит ...
Поэтому я решил попробовать max_by
, используя это chapters.max_by { |_, v| v[:volume].to_d && v[:chapter].to_d }
, с тем же предположением. Который также заканчивал тем, что потерпел неудачу, когда есть единственная глава за объем.
Мое решение в итоге оказалось:
chapters
.group_by { |_, v| v[:volume].to_d }.max.last.to_h
.max_by { |_, v| v[:chapter].to_d }
, которое работает по очевидным причинам, но чувствует себя довольно неэффективно. Должен быть способ использовать один max
или max_by
. Хотелось бы услышать некоторые идеи по этому поводу