如何用单独数组中的值替换散列的键名?

How to replace a Hash's key names with the values from a separate array?

我有一个散列,例如:

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

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

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

我怎样才能在 Ruby 中最好地实现这个目标?

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"}
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"}

你的代码取决于被抓取的 table 的顺序(或者你从 table 中抓取数据的顺序),这看起来有点脆弱。我会使用从 table 字段名称到模型属性名称的显式映射(反之亦然,对于 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"}