用另一个键替换所有HASH键



我正试图用另一个密钥替换哈希中的所有密钥,如下所示:

{
name: 'Josh',
surname: 'Simon',
cars: [{
name: 'Diablo',
seats: [{ name: 'Josh', surname: 'Simon' }],
},
{
name: 'Raptor',
seats: [{ name: 'Josh', surname: 'Simon' }],
},
{
name: 'Testarossa',
seats: [{ name: 'Josh', surname: 'Simon' }],
}],
}

假设我想将汽车密钥更改为,这样我就可以实现类似的功能

{
name: 'Josh',
surname: 'Simon',
cars: [{
name: 'Diablo',
people: [{ name: 'Josh', surname: 'Simon' }],
},
{
name: 'Raptor',
people: [{ name: 'Josh', surname: 'Simon' }],
},
{
name: 'Testarossa',
people: [{ name: 'Josh', surname: 'Simon' }],
}],
}

这能以某种方式做到吗?

您可以删除旧密钥并将该值分配给新的

hash =
{
name: 'Josh',
surname: 'Simon',
cars: [{
name: 'Diablo',
seats: [{ name: 'Josh', surname: 'Simon' }],
},
{
name: 'Raptor',
seats: [{ name: 'Josh', surname: 'Simon' }],
},
{
name: 'Testarossa',
seats: [{ name: 'Josh', surname: 'Simon' }],
}],
}
hash[:cars].each { |h| h[:people] = h.delete(:seats) }
hash
# => {
#      name: 'Josh',
#      surname: 'Simon',
#      cars: [{
#        name: 'Diablo',
#        people: [{ name: 'Josh', surname: 'Simon' }],
#      },
#      {
#        name: 'Raptor',
#        people: [{ name: 'Josh', surname: 'Simon' }],
#      },
#      {
#        name: 'Testarossa',
#        people: [{ name: 'Josh', surname: 'Simon' }],
#      }],
#    }  

如果变量hash包含示例中给定的哈希,并且该对象要进行变异,则可以编写以下内容。

hash[:cars].each { |h| h.transform_keys! { |k| k == :seats ? :people : k } }
#=> [
#    {
#     :name=>"Diablo",
#     :people=>[{:name=>"Josh", :surname=>"Simon"}]
#    },
#    {
#     :name=>"Raptor",
#     :people=>[{:name=>"Josh", :surname=>"Simon"}]
#    },
#    {
#     :name=>"Testarossa",
#     :people=>[{:name=>"Josh", :surname=>"Simon"}]
#    }
#   ]

​所以现在

hash
#=> {
#    :name=>"Josh",
#    :surname=>"Simon",
#    :cars=>[
#      {
#       :name=>"Diablo",
#       :people=>[{:name=>"Josh", :surname=>"Simon"}]
#      },
#      {
#       :name=>"Raptor",
#       :people=>[{:name=>"Josh", :surname=>"Simon"}]
#      },
#      {
#       :name=>"Testarossa",
#       :people=>[{:name=>"Josh", :surname=>"Simon"}]
#      } 
#    ]
#   }

请参阅哈希#transform_keys!。


如果不更改哈希,则可以对深度副本进行操作。其中一种方法是使用Marshal::load和Marshal::dump:方法

h = Marshal.load(Marshal.dump(hash))
#=> {
#    :name=>"Josh",
#    :surname=>"Simon",
#    :cars=>[
#      {
#       :name=>"Diablo",
#       :seats=>[{:name=>"Josh", :surname=>"Simon"}]
#      },
#      {
#       :name=>"Raptor",
#       :seats=>[{:name=>"Josh", :surname=>"Simon"}]
#      },
#      {
#        :name=>"Testarossa",
#        :seats=>[{:name=>"Josh", :surname=>"Simon"}]
#      }
#    ]
#   }

注意,如果我们通过写入(例如(来更改h

h[:name] = "Lola"
h[:cars][1][:seats][0] = "cats"

我们可以验证CCD_ 3是不变的。

你可以这样做:

hash =
{
name: 'Josh',
surname: 'Simon',
cars: [{
name: 'Diablo',
seats: [{ name: 'Josh', surname: 'Simon' }],
},
{
name: 'Raptor',
seats: [{ name: 'Josh', surname: 'Simon' }],
},
{
name: 'Testarossa',
seats: [{ name: 'Josh', surname: 'Simon' }],
}],
}
hash[:cars].each { |record| record.store(:people, record.delete(:seats)) }

最新更新