Man*_*Das 174 ruby hash ruby-on-rails ruby-on-rails-3
我有一个条件,我得到一个哈希
hash = {"_id"=>"4de7140772f8be03da000018", .....}
Run Code Online (Sandbox Code Playgroud)
我希望这个哈希为
hash = {"id"=>"4de7140772f8be03da000018", ......}
Run Code Online (Sandbox Code Playgroud)
PS:我不知道哈希中的键是什么,它们是随机的,每个键带有一个"_"前缀,我不想要下划线
gay*_*vat 672
hash[:new_key] = hash.delete :old_key
Run Code Online (Sandbox Code Playgroud)
gay*_*vat 129
rails Hash有标准方法:
hash.transform_keys{ |key| key.to_s.upcase }
Run Code Online (Sandbox Code Playgroud)
http://api.rubyonrails.org/classes/Hash.html#method-i-transform_keys
UPD:ruby 2.5方法
mu *_*ort 38
如果所有键都是字符串并且所有键都有下划线前缀,那么您可以使用以下方法修补哈希值:
h.keys.each { |k| h[k[1, k.length - 1]] = h[k]; h.delete(k) }
Run Code Online (Sandbox Code Playgroud)
除第一个字符外,该k[1, k.length - 1]
位抓取所有内容k
.如果你想要一份副本,那么:
new_h = Hash[h.map { |k, v| [k[1, k.length - 1], v] }]
Run Code Online (Sandbox Code Playgroud)
要么
new_h = h.inject({ }) { |x, (k,v)| x[k[1, k.length - 1]] = v; x }
Run Code Online (Sandbox Code Playgroud)
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 }
Run Code Online (Sandbox Code Playgroud)
并且,如果只有一些键具有下划线前缀:
h.keys.each do |k|
if(k[0,1] == '_')
h[k[1, k.length - 1]] = h[k]
h.delete(k)
end
end
Run Code Online (Sandbox Code Playgroud)
可以对上面的所有其他变体进行类似的修改,但这两个变体:
Hash[h.map { |k, v| [k.sub(/\A_/, ''), v] }]
h.inject({ }) { |x, (k,v)| x[k.sub(/\A_/, '')] = v; x }
Run Code Online (Sandbox Code Playgroud)
没有额外修改的键没有下划线前缀应该没问题.
Sad*_*tam 14
你可以做
hash.inject({}){|option, (k,v) | option["id"] = v if k == "_id"; option}
Run Code Online (Sandbox Code Playgroud)
这适用于您的情况!
Dig*_*oss 10
h.inject({}) { |m, (k,v)| m[k.sub(/^_/,'')] = v; m }
Run Code Online (Sandbox Code Playgroud)
Swa*_*kar 10
如果我们想要重命名哈希中的特定键,那么我们可以按如下方式执行:
假设我的哈希是 my_hash = {'test' => 'ruby hash demo'}
现在我想用'message'替换'test',然后:
my_hash['message'] = my_hash.delete('test')
对于带有transform_keys和delete_prefix / delete_suffix方法的Ruby 2.5或更新版本:
hash1 = { '_id' => 'random1' }
hash2 = { 'old_first' => '123456', 'old_second' => '234567' }
hash3 = { 'first_com' => 'google.com', 'second_com' => 'amazon.com' }
hash1.transform_keys { |key| key.delete_prefix('_') }
# => {"id"=>"random1"}
hash2.transform_keys { |key| key.delete_prefix('old_') }
# => {"first"=>"123456", "second"=>"234567"}
hash3.transform_keys { |key| key.delete_suffix('_com') }
# => {"first"=>"google.com", "second"=>"amazon.com"}
Run Code Online (Sandbox Code Playgroud)