如何用单独数组中的值替换哈希的键名?

时间:2017-08-01 13:16:06

标签: ruby enumeration

我有一个哈希,例如:

hash = {field1: 'name', field2: 'street1', field3: 'street2', field4: 'city'}

我想用一个单独的数组中的值替换所有的键名,例如:

array = [:address1, :address2, :address3, :city]

我怎么能在Ruby中最好地实现这一点?

3 个答案:

答案 0 :(得分:4)

hash = {field1: 'name', field2: 'street1', field3: 'street2', field4: 'city'}
array = [:address1, :address2, :address3, :city]

h = Hash[array.zip hash.values]
# => {:address1=>"name", :address2=>"street1", :address3=>"street2", :city=>"city"}

答案 1 :(得分:3)

hash = {field1: 'name', field2: 'street1', field3: 'street2', field4: 'city'}
array = [:address1, :address2, :address3, :city]
hash.each_with_index.map { |(k, v), i| [array[i], v] }.to_h
#=> {:address1=>"name", :address2=>"street1", :address3=>"street2", :city=>"city"}

答案 2 :(得分:3)

您的代码取决于已删除表的顺序(或您从表中抓取数据的顺序),这看起来有点脆弱。我会使用从表字段名称到模型属性名称的显式映射(反之亦然,它对于1:1映射并不重要):

attrs = {
  :field1 => :address1,
  :field2 => :address2,
  :field3 => :address3,
  :field4 => :city
}

给出哈希:

hash = { field1: 'name', field2: 'street1', field3: 'street2', field4: 'city' }

可以通过以下方式转换:

attrs.map { |k, v| [v, hash[k]] }.to_h
#=> {:address1=>"name", :address2=>"street1", :address3=>"street2", :city=>"city"}