如何用另一个键replace散列键

我有一个条件,我得到一个哈希

hash = {"_id"=>"4de7140772f8be03da000018", .....} 

我想要这个散列

  hash = {"id"=>"4de7140772f8be03da000018", ......} 

PS :我不知道密钥是什么,它们是随机的,每个密钥都带有一个“_”前缀,我不想下划线

如果所有的键都是string,并且所有的都有下划线前缀,那么你可以使用下面的代码修改哈希:

 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 } 

你也可以使用sub如果你不喜欢k[]符号提取一个子string:

 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 } 

应该没有额外的修改没有下划线前缀的键。

 hash[:new_key] = hash.delete :old_key 

导轨哈希有标准的方法:

 hash.transform_keys{ |key| key.to_s.upcase } 

http://api.rubyonrails.org/classes/Hash.html#method-i-transform_keys

你可以做

 hash.inject({}){|option, (k,v) | option["id"] = v if k == "_id"; option} 

这应该适合你的情况!

 h.inject({}) { |m, (k,v)| m[k.sub(/^_/,'')] = v; m } 

如果我们想在hash中重命名一个特定的键,那么我们可以这样做:
假设我的散列是my_hash = {'test' => 'ruby hash demo'}
现在我想用'message'replace'test',然后:
my_hash['message'] = my_hash.delete('test')

 hash.each {|k,v| hash.delete(k) && hash[k[1..-1]]=v if k[0,1] == '_'}