我有一个哈希,例如:
hash = {field1: 'name', field2: 'street1', field3: 'street2', field4: 'city'}
我想用一个单独的数组中的值替换所有的键名,例如:
array = [:address1, :address2, :address3, :city]
我怎么能在Ruby中最好地实现这一点?
答案 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"}