我有一个条件,我得到一个哈希值
hash = {"_id"=>"4de7140772f8be03da000018", .....}
我想让这个散列
hash = {"id"=>"4de7140772f8be03da000018", ......}
附注:我不知道哈希中的键是什么,它们是随机的,每个键都有一个“_”前缀,我不想要下划线
我有一个条件,我得到一个哈希值
hash = {"_id"=>"4de7140772f8be03da000018", .....}
我想让这个散列
hash = {"id"=>"4de7140772f8be03da000018", ......}
附注:我不知道哈希中的键是什么,它们是随机的,每个键都有一个“_”前缀,我不想要下划线
当前回答
rails哈希有标准的方法:
hash.transform_keys{ |key| key.to_s.upcase }
http://api.rubyonrails.org/classes/Hash.html#method-i-transform_keys
UPD: ruby 2.5方法
其他回答
h.inject({}) { |m, (k,v)| m[k.sub(/^_/,'')] = v; m }
如果你在一个哈希中有一个哈希,比如
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
如果你只想改变一个键,在Ruby 2.8+中有一个简单的方法,使用transform_keys方法。在这个例子中,如果你想改变_id为id,那么你可以:
hash.transform_keys({_id: :id})
参考:https://bugs.ruby-lang.org/issues/16274
如果我们想在哈希中重命名一个特定的键,那么我们可以这样做: 假设我的哈希是my_hash = {'test' => 'ruby哈希演示'} 现在我想用'message'替换'test',然后: My_hash ['message'] = My_hash .delete('test')
如果所有的键都是字符串,并且都有下划线前缀,那么你可以用这个来修补哈希:
h.keys.each { |k| h[k[1, k.length - 1]] = h[k]; h.delete(k) }
k[1, k.length - 1]位获取除第一个字符以外的所有k个字符。如果你想要一份拷贝,那么:
new_h = Hash[h.map { |k, v| [k[1, k.length - 1], v] }]
Or
new_h = h.inject({ }) { |x, (k,v)| x[k[1, k.length - 1]] = v; x }
如果你不喜欢用k[]符号来提取子字符串,你也可以使用sub:
h.keys.each { |k| h[k.sub(/\A_/, '')] = h[k]; h.delete(k) }
Hash[h.map { |k, v| [k.sub(/\A_/, ''), v] }]
h.inject({ }) { |x, (k,v)| x[k.sub(/\A_/, '')] = v; x }
并且,如果只有一些键有下划线前缀:
h.keys.each do |k|
if(k[0,1] == '_')
h[k[1, k.length - 1]] = h[k]
h.delete(k)
end
end
类似的修改可以对上述所有其他变体做,但这两个:
Hash[h.map { |k, v| [k.sub(/\A_/, ''), v] }]
h.inject({ }) { |x, (k,v)| x[k.sub(/\A_/, '')] = v; x }
如果没有额外的修改,应该可以使用没有下划线前缀的键。