Ответ 1
arr = ["one", "two", "three", "four", "five"]
x = Hash[(0...arr.size).zip arr]
# => {0=>"one", 1=>"two", 2=>"three", 3=>"four", 4=>"five"}
Я преобразую массив в хэш, где ключи являются индексами, а значения - это элементы этого индекса.
Вот как я это сделал
# initial stuff
arr = ["one", "two", "three", "four", "five"]
x = {}
# iterate and build hash as needed
arr.each_with_index {|v, i| x[i] = v}
# result
>>> {0=>"one", 1=>"two", 2=>"three", 3=>"four", 4=>"five"}
Есть ли лучшее (в любом смысле слова "лучше" ) способ сделать это?
arr = ["one", "two", "three", "four", "five"]
x = Hash[(0...arr.size).zip arr]
# => {0=>"one", 1=>"two", 2=>"three", 3=>"four", 4=>"five"}
Рубин & lt; 2,1:
Hash[arr.map.with_index { |x, i| [i, x] }]
#=> {0=>"one", 1=>"two", 2=>"three", 3=>"four", 4=>"five"}
Ruby> = 2.1:
arr.map.with_index { |x, i| [i, x] }.to_h
x = Hash.new{|h, k| h[k] = arr[k]}
%w[one two three four five].map.with_index(1){ |*x| x.reverse }.to_h
Удалите (1)
, если вы хотите запустить индекс из 0
.
Вот решение, использующее Object#tap
для добавления значений во вновь созданный хэш:
arr = ["one", "two", "three", "four", "five"]
{}.tap do |hsh|
arr.each_with_index { |item, idx| hsh[idx] = item }
end
#=> {0=>"one", 1=>"two", 2=>"three", 3=>"four", 4=>"five"}
Уже много хороших решений, просто добавление варианта (при условии, что у вас нет дублированных значений):
["one", "two", "three", "four", "five"].map.with_index.to_h.invert
# => {0=>"one", 1=>"two", 2=>"three", 3=>"four", 4=>"five"}
Вы можете установить патч обезьяны Array
, чтобы предоставить новый метод:
class Array
def to_assoc offset = 0
# needs recent enough ruby version
map.with_index(offset).to_h.invert
end
end
Теперь вы можете сделать:
%w(one two three four).to_assoc(1)
# => {1=>"one", 2=>"two", 3=>"three", 4=>"four"}
Это обычная операция, которую я выполняю в Rails-приложениях, поэтому я сохраняю этот патч обезьяны в инициализаторе.