Если вы готовы принять
{ 1=>[0], 3=>[1], 4=>[2], 5=>[3], 6=>[4,5,6] }
в качестве возвращаемого значения, вы можете написать следующее.
array.each_with_index.group_by(&:first).transform_values { |v| v.map(&:last) }
#=> {1=>[0], 3=>[1], 4=>[2], 5=>[3], 6=>[4, 5, 6]}
Первый шаг в этом расчете следующий:
array.each_with_index.group_by(&:first)
#=> {1=>[[1, 0]], 3=>[[3, 1]], 4=>[[4, 2]], 5=>[[5, 3]], 6=>[[6, 4], [6, 5], [6, 6]]}
Это может помочь читателям следить за последующими вычислениями.
Я думаю, вы найдете это возвращаемое значение, как правило, более удобным в использовании, чем приведенное в вопросе.
ЗдесьВот пара примеров, в которых явно желательно, чтобы все значения были массивами.Пусть:
h_orig = { 1=>0, 3=>1, 4=>2, 5=>3, 6=>[4,5,6] }
h_mod { 1=>[0], 3=>[1], 4=>[2], 5=>[3], 6=>[4,5,6] }
Создать хэш h
, ключи которого являются уникальными элементами array
, а значения которого представляют собой число раз, когда ключ появляется в массиве
h_mod.transform_values(&:count)
#=> {1=>1, 3=>1, 4=>1, 5=>1, 6=>3}
h_orig.transform_values { |v| v.is_a?(Array) ? v.count : 1 }
Создайте хеш h
, ключи которого являются уникальными элементами array
и значения которого равны индексу первого экземпляра элемента в массиве.
h_mod.transform_values(&:min)
#=> {1=>0, 3=>1, 4=>2, 5=>3, 6=>4}
h_orig.transform_values { |v| v.is_a?(Array) ? v.min : v }
В этих примерах, учитывая h_orig
, мы могли бы альтернативно преобразовать значения, которые являются индексами, в массивы, содержащие один индекс.
h_orig.transform_values { |v| [*v].count }
h_orig.transform_values { |v| [*v].min }
Это вряд ли доказательство того, что в целом все значения удобнеемассивы, но это был мой опыт и опыт многих других.