转换这个数组:
a = ["item 1", "item 2", "item 3", "item 4"]
...到哈希值:
{ "item 1" => "item 2", "item 3" => "item 4" }
例如,偶数下标处的元素是键,奇数下标处的元素是值。
转换这个数组:
a = ["item 1", "item 2", "item 3", "item 4"]
...到哈希值:
{ "item 1" => "item 2", "item 3" => "item 4" }
例如,偶数下标处的元素是键,奇数下标处的元素是值。
当前回答
Ruby 2.1.0在Array上引入了to_h方法,如果原始数组由键-值对数组组成,则该方法可以满足您的需求:http://www.ruby-doc.org/core-2.1.0/Array.html#method-i-to_h。
[[:foo, :bar], [1, 2]].to_h
# => {:foo => :bar, 1 => 2}
其他回答
只用哈希。[]与数组中的值。例如:
arr = [1,2,3,4]
Hash[*arr] #=> gives {1 => 2, 3 => 4}
Ruby 2.1.0在Array上引入了to_h方法,如果原始数组由键-值对数组组成,则该方法可以满足您的需求:http://www.ruby-doc.org/core-2.1.0/Array.html#method-i-to_h。
[[:foo, :bar], [1, 2]].to_h
# => {:foo => :bar, 1 => 2}
a = ["item 1", "item 2", "item 3", "item 4"]
h = Hash[*a] # => { "item 1" => "item 2", "item 3" => "item 4" }
就是这样。*被称为splat操作符。
@Mike Lewis(在评论中)提醒一句:“要非常小心。Ruby在堆栈上扩展splat。如果你用一个大型数据集来做这件事,预计会让你的堆栈崩溃。”
因此,对于大多数一般的用例,这种方法是很好的,但如果您想对大量数据进行转换,请使用不同的方法。例如,@Łukasz Niemier(也在评论中)为大型数据集提供了这种方法:
h = Hash[a.each_slice(2).to_a]
或者如果你有一个[key, value]数组,你可以这样做:
[[1, 2], [3, 4]].inject({}) do |r, s|
r.merge!({s[0] => s[1]})
end # => { 1 => 2, 3 => 4 }
a = ["item 1", "item 2", "item 3", "item 4"]
Hash[ a.each_slice( 2 ).map { |e| e } ]
或者,如果你讨厌Hash[…]]:
a.each_slice( 2 ).each_with_object Hash.new do |(k, v), h| h[k] = v end
或者,如果你是坏函数式编程的懒粉丝:
h = a.lazy.each_slice( 2 ).tap { |a|
break Hash.new { |h, k| h[k] = a.find { |e, _| e == k }[1] }
}
#=> {}
h["item 1"] #=> "item 2"
h["item 3"] #=> "item 4"