我正在将数组转换为散列,其中键是索引,值是该索引处的元素。
我是这样做的
# 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"}
有没有更好的(在“更好”这个词的任何意义上)这样做的方式?
答案 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应用程序中执行的常见操作,因此我将此猴子补丁保留在初始化程序中。