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

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

我想让这个散列

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

附注:我不知道哈希中的键是什么,它们是随机的,每个键都有一个“_”前缀,我不想要下划线


当前回答

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

其他回答

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

你可以这样做

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

这应该对你的情况有用!

rails哈希有标准的方法:

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

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

UPD: ruby 2.5方法

以前的答案已经足够好了,但它们可能会更新原始数据。 如果您不希望原始数据受到影响,您可以试试我的代码。

 newhash=hash.reject{|k| k=='_id'}.merge({id:hash['_id']})

首先,它将忽略键'_id',然后与更新后的键合并。

如果你只想改变一个键,在Ruby 2.8+中有一个简单的方法,使用transform_keys方法。在这个例子中,如果你想改变_id为id,那么你可以:

 hash.transform_keys({_id: :id})

参考:https://bugs.ruby-lang.org/issues/16274