我有一个条件,我得到一个哈希值
hash = {"_id"=>"4de7140772f8be03da000018", .....}
我想让这个散列
hash = {"id"=>"4de7140772f8be03da000018", ......}
附注:我不知道哈希中的键是什么,它们是随机的,每个键都有一个“_”前缀,我不想要下划线
我有一个条件,我得到一个哈希值
hash = {"_id"=>"4de7140772f8be03da000018", .....}
我想让这个散列
hash = {"id"=>"4de7140772f8be03da000018", ......}
附注:我不知道哈希中的键是什么,它们是随机的,每个键都有一个“_”前缀,我不想要下划线
当前回答
如果你在一个哈希中有一个哈希,比如
hash = {
"object" => {
"_id"=>"4de7140772f8be03da000018"
}
}
如果你想把_id改成token
你可以在这里使用deep_transform_keys并这样做
hash.deep_transform_keys do |key|
key = "token" if key == "_id"
key
end
结果是
{
"object" => {
"token"=>"4de7140772f8be03da000018"
}
}
即使你有一个符号键哈希作为开始,比如
hash = {
object: {
id: "4de7140772f8be03da000018"
}
}
您可以组合所有这些概念,将它们转换为字符串键散列
hash.deep_transform_keys do |key|
key = "token" if key == :id
key.to_s
end
其他回答
如果你在一个哈希中有一个哈希,比如
hash = {
"object" => {
"_id"=>"4de7140772f8be03da000018"
}
}
如果你想把_id改成token
你可以在这里使用deep_transform_keys并这样做
hash.deep_transform_keys do |key|
key = "token" if key == "_id"
key
end
结果是
{
"object" => {
"token"=>"4de7140772f8be03da000018"
}
}
即使你有一个符号键哈希作为开始,比如
hash = {
object: {
id: "4de7140772f8be03da000018"
}
}
您可以组合所有这些概念,将它们转换为字符串键散列
hash.deep_transform_keys do |key|
key = "token" if key == :id
key.to_s
end
hash[:new_key] = hash.delete :old_key
hash.each {|k,v| hash.delete(k) && hash[k[1..-1]]=v if k[0,1] == '_'}
对于Ruby 2.5或更新版本,使用transform_keys和delete_prefix / delete_suffix方法:
hash1 = { '_id' => 'random1' }
hash2 = { 'old_first' => '123456', 'old_second' => '234567' }
hash3 = { 'first_com' => 'google.com', 'second_com' => 'amazon.com' }
hash1.transform_keys { |key| key.delete_prefix('_') }
# => {"id"=>"random1"}
hash2.transform_keys { |key| key.delete_prefix('old_') }
# => {"first"=>"123456", "second"=>"234567"}
hash3.transform_keys { |key| key.delete_suffix('_com') }
# => {"first"=>"google.com", "second"=>"amazon.com"}
h.inject({}) { |m, (k,v)| m[k.sub(/^_/,'')] = v; m }