首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何用一个哈希键替换另一个哈希键

如何用一个哈希键替换另一个哈希键
EN

Stack Overflow用户
提问于 2011-06-02 12:54:50
回答 11查看 114.8K关注 0票数 221

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

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

我希望这个哈希值为

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

P.S:我不知道散列中的关键字是什么,它们是随机的,每个关键字都有一个"_“前缀,我不想要下划线

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2013-10-10 22:22:50

hash[:new_key] = hash.delete :old_key
票数 768
EN

Stack Overflow用户

发布于 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方法

票数 153
EN

Stack Overflow用户

发布于 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 }

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

票数 39
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6210572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档