Подтвердить что ты не робот

Преобразование массива в хэш, где ключи - это индексы

Я преобразую массив в хэш, где ключи являются индексами, а значения - это элементы этого индекса.

Вот как я это сделал

# 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"}

Есть ли лучшее (в любом смысле слова "лучше" ) способ сделать это?

4b9b3361

Ответ 1

arr = ["one", "two", "three", "four", "five"]

x = Hash[(0...arr.size).zip arr]
# => {0=>"one", 1=>"two", 2=>"three", 3=>"four", 4=>"five"}

Ответ 2

Рубин & 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

Ответ 3

x = Hash.new{|h, k| h[k] = arr[k]}

Ответ 4

%w[one two three four five].map.with_index(1){ |*x| x.reverse }.to_h

Удалите (1), если вы хотите запустить индекс из 0.

Ответ 5

Вот решение, использующее 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"}

Ответ 6

Уже много хороших решений, просто добавление варианта (при условии, что у вас нет дублированных значений):

["one", "two", "three", "four", "five"].map.with_index.to_h.invert
# => {0=>"one", 1=>"two", 2=>"three", 3=>"four", 4=>"five"}

Ответ 7

Вы можете установить патч обезьяны 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-приложениях, поэтому я сохраняю этот патч обезьяны в инициализаторе.