将Ruby中的数组转换为具有特定键的哈希值

7

有没有一种方法可以在Ruby中从数组中提取值并为每个值分配一个唯一的键?

我想能够将这个数组转换成:

["12", "21", "1985"]

转换为这个哈希表:

{:month => "12", :day => "21", :year => "1985"}

我不想像这样逐个赋值:

arr = ["12", "21", "1985"]
bday_hash = {:month => arr[0], :day => arr[1], :year => arr[2]}

ary = ["12", "21", "1985"]; h = { month: ary[0], day: ary[1], year: ary[2] } - Sergio Tulentsev
4个回答

14
你可以使用 #zip
your_array = ["12", "21", "1985"]
keys = ['month', 'day', 'year']
keys.zip(your_array).to_h

如果使用的 Ruby 版本小于 2.1,则不支持 to_h。建议使用 Hash[keys.zip(values)],如 @MikDiet 所建议。 - vinays84

8
你可以将键数组与值压缩,然后转换成哈希表。
keys = [:month, :day, :year]
values = ["12", "21", "1985"]
Hash[keys.zip(values)]
# => {:month=>"12", :day=>"21", :year=>"1985"} 

3
没错,你是对的。文件说明写着“可转换为哈希对象”。通过 .to_hash 进行转换,在哈希对象上只会返回自身。起初我读代码时误解了,以为转换是通过“键值对”路线进行的,这会涉及一个中间哈希和一个数组。不过在像那种情况下使用字面量更好 :) - Sergio Tulentsev

2
以下是获得所需哈希值的另外两种方法。
arr_values = ["12", "21", "1985"]
arr_keys   = [:month, :day, :year]

[arr_keys, arr_values].transpose.to_h
  #=> {:month=>"12", :day=>"21", :year=>"1985"}

arr_keys.each_index.with_object({}) { |i, h| h[arr_keys[i]] = arr_values[i] } 
  #=> {:month=>"12", :day=>"21", :year=>"1985"}

1
我添加了一个方法到Array中,以便于进行这种类型的转换。
class Array

  def fold_into_hash(values)
    result = {}

    self.each_with_index do |key, index|
      result[key] = values[index]
    end

    result
  end

end

month_day_year = [:month, :day, :year]

#...

puts month_day_year.fold_into_hash(["12", "21", "1985"])

产生以下结果:

{:month=>"12", :day=>"21", :year=>"1985"}

虽然你可以这样做,但没有必要,因为zipto_hHash[]会更快。 - the Tin Man
当然,已经发布了带有压缩文件的答案。目标是提出替代想法。所有答案都涉及某种程度的设计妥协。 - Peter Camilleri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接