我正试图用另一个密钥替换哈希中的所有密钥,如下所示:
{
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)) }