13

我有一个数组,其中包含X多个值。下面的数组只有 4 个,但我需要代码是动态的,并且不依赖于只有四个数组对象。

array = ["Adult", "Family", "Single", "Child"]

我想转换array为如下所示的哈希:

hash = {0 => 'Adult', 1 => 'Family', 2 => 'Single', 3 => 'Child'}

散列应该有与数组有对象一样多的键/值对,并且值应该从 0 开始并为每个对象递增 1。

4

4 回答 4

16

使用Enumerable#each_with_index

Hash[array.each_with_index.map { |value, index| [index, value] }]
# => {0=>"Adult", 1=>"Family", 2=>"Single", 3=>"Child"}

正如@hirolau 评论的那样,each_with_index.map也可以写成map.with_index.

Hash[array.map.with_index { |value, index| [index, value] }]
# => {0=>"Adult", 1=>"Family", 2=>"Single", 3=>"Child"}

更新

使用的替代方法Hash#invert

Hash[array.map.with_index{|*x|x}].invert
# => {0=>"Adult", 1=>"Family", 2=>"Single", 3=>"Child"}
Hash[[*array.map.with_index]].invert
# => {0=>"Adult", 1=>"Family", 2=>"Single", 3=>"Child"}
于 2013-10-12T04:44:53.160 回答
4

另一个:

Hash[array.each_index.zip(array)]
#=> {0=>"Adult", 1=>"Family", 2=>"Single", 3=>"Child"}

较新的 Ruby 版本将允许:

array.each_with_index.to_h.invert
#=> {0=>"Adult", 1=>"Family", 2=>"Single", 3=>"Child"}
于 2013-10-12T15:41:45.027 回答
1
  Hash[*(0..array.size-1).to_a.zip(array)]
    => {0=>"Adult", 1=>"Family", 2=>"Single", 3=>"Child"} 
于 2013-10-12T05:19:20.687 回答
0

试试这个

array.each_with_index.inject({}){ |hash, (val, i)| hash[i]=val; hash }
=> {0=>"Adult", 1=>"Family", 2=>"Single", 3=>"Child"} 
于 2017-05-26T13:24:28.153 回答