内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
我有一个条件,我得到一个散列
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 }
对于没有下划线前缀而没有额外修改的密钥应该没问题。