ruby-on-rails Ruby:重命名哈希中的键和值的最有效方法

xqnpmsa8  于 2023-01-14  发布在  Ruby
关注(0)|答案(2)|浏览(117)

我有一个哈希数组如下:

"data":[
      {
         "Id":"1",
         "Name":"John"
      },
      {
         "Id":"2",
         "Name":"Robert"
      },
      {
         "Id":"3",
         "Name":"Steve"
      },
      {
         "Name":"Tom",
         "Country":"USA"
      }
   ]

我想:
1.将所有关键点名称重命名为First_Name。
1.然后是从Tom到Thomas的任何First_Name值。
比如:

"data":[
    {
       "Id":"1",
     "First_Name":"John"
    },
    {
       "Id":"2",
     "First_Name":"Robert"
    },
    {
       "Id":"3",
     "First_Name":"Steve"
    },
    {
       "First_Name":"Thomas",
       "Country":"USA"
    }
 ]

我收集了一些

data.map{|h| {"First_Name"=>h['Name']} }
data.map{|h| h['First_Name'] = "Thomas" if h['First_Name'] == "Tom" }

最有效的方法是什么?

disho6za

disho6za1#

如果您使用的是Ruby 3.0+,您可以执行以下操作:

data.each do |hash|
  hash.transform_keys!({Name: 'First_Name'})
  hash.transform_values! { |v| v == 'Tom' ? 'Thomas' : v }
end

如果您使用的是3.0以下的Ruby版本,则可以:

data.each do |hash|
  hash.transform_keys! { |k| k == 'Name' ? 'First_Name' : k }
  hash.transform_values! { |v| v == 'Tom' ? 'Thomas' : v }
end
xriantvc

xriantvc2#

我认为就地编辑数据的更好方法是:

data.each {|h| h["First Name"] = h.delete "Name"}
data.each {|h| h["First Name"] = "Tom" if h["First Name"] == "Thomas"}

当你调用hash.delete的时候,它会返回它正在删除的键/值对的值,所以你可以使用=赋值语句在一个新的键/值对中获取这个值。
为了提高效率,只需将其合并到一个循环中:

data.each do |h|
  h["First Name"] = h.delete "Name"
  h["First Name"] = "Tom" if h["First Name"] == "Thomas"
end

相关问题