将数组转换为哈希,其中键是索引

时间:2013-01-25 18:56:44

标签: ruby

我正在将数组转换为散列,其中键是索引,值是该索引处的元素。

我是这样做的

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

有没有更好的(在“更好”这个词的任何意义上)这样做的方式?

7 个答案:

答案 0 :(得分:41)

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

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

答案 1 :(得分:21)

Ruby< 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

答案 2 :(得分:4)

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

答案 3 :(得分:3)

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

如果要从(1)启动索引,请删除0

答案 4 :(得分:1)

以下是使用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"}

答案 5 :(得分:1)

已经有很多好的解决方案,只需添加一个变体(前提是您没有重复的值):

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

答案 6 :(得分:0)

您可以使用补丁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应用程序中执行的常见操作,因此我将此猴子补丁保留在初始化程序中。