如何用另一个键替换散列键?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (24)

我有一个条件,我得到一个散列

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

我想要这个散列

  hash = {"id"=>"4de7140772f8be03da000018", ......}
提问于
用户回答回答于

如果所有的键都是字符串,并且它们都有下划线前缀,那么你可以用下面的代码修改散列:

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[]提取子字符串的符号,也可以使用它:

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 }

对于没有下划线前缀而没有额外修改的密钥应该没问题。

用户回答回答于

扫码关注云+社区