我有一个条件,我得到一个哈希值
hash = {"_id"=>"4de7140772f8be03da000018", .....}
我希望这个哈希值为
hash = {"id"=>"4de7140772f8be03da000018", ......}
P.S:我不知道散列中的关键字是什么,它们是随机的,每个关键字都有一个"_“前缀,我不想要下划线
发布于 2013-10-10 22:22:50
hash[:new_key] = hash.delete :old_key
发布于 2015-09-18 19:42:03
rails Hash有它的标准方法:
hash.transform_keys{ |key| key.to_s.upcase }
http://api.rubyonrails.org/classes/Hash.html#method-i-transform_keys
更新: ruby 2.5方法
发布于 2011-06-02 13:12:36
如果所有的键都是字符串,并且它们都有下划线前缀,那么您可以使用以下内容来修补散列:
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] }]
或
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 }
对于不带下划线前缀的键应该没有额外的修改。
https://stackoverflow.com/questions/6210572
复制相似问题