Хотя эквивалентно, массив, приведенный в вопросе, обычно пишется:
arr = [{ "A" => { "value_1" => 30, "value_2" => 240 } },
{ "B" => { "value_1" => 40, "value_2" => 250 } },
{ "C" => { "value_1" => 18, "value_2" => 60 } }]
Мы можем найти нужный ключ следующим образом:
arr.max_by { |h| h.values.first["value_2"] }.keys.first
#=> "B"
См. Enumerable # max_by . Шаги:
g = arr.max_by { |h| h.values.first["value_2"] }
#=> {"B"=>{"value_1"=>40, "value_2"=>250}}
a = g.keys
#=> ["B"]
a.first
#=> "B"
При вычислении g
для
h = arr[0]
#=> {"A"=>{"value_1"=>30, "value_2"=>240}}
вычисление блока составляет
a = h.values
#=> [{"value_1"=>30, "value_2"=>240}]
b = a.first
#=> {"value_1"=>30, "value_2"=>240}
b["value_2"]
#=> 240
Предположим, сейчас arr
выглядит следующим образом:
arr << { "D" => { "value_1" => 23, "value_2" => 250 } }
#=> [{"A"=>{"value_1"=>30, "value_2"=>240}},
# {"B"=>{"value_1"=>40, "value_2"=>250}},
# {"C"=>{"value_1"=>18, "value_2"=>60}},
# {"D"=>{"value_1"=>23, "value_2"=>250}}]
и мы будем sh возвращать массив всех ключей, для которых значение "value_2"
является максимальным (["B", "D"]
). Мы можем получить это следующим образом.
max_val = arr.map { |h| h.values.first["value_2"] }.max
#=> 250
arr.select { |h| h.values.first["value_2"] == max_val }.flat_map(&:keys)
#=> ["B", "D"]
flat_map(&:keys)
- сокращение от:
flat_map { |h| h.keys }
, которое возвращает тот же массив, что и:
map { |h| h.keys.first }
См. перечислимых # flat_map .