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

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

我想让这个散列

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

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


当前回答

你可以这样做

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

这应该对你的情况有用!

其他回答

如果你在一个哈希中有一个哈希,比如

hash = {
  "object" => {
     "_id"=>"4de7140772f8be03da000018"
  }
}

如果你想把_id改成token

你可以在这里使用deep_transform_keys并这样做

hash.deep_transform_keys do |key|
  key = "token" if key == "_id"
  key
end

结果是

{
  "object" => {
     "token"=>"4de7140772f8be03da000018"
  }
}

即使你有一个符号键哈希作为开始,比如

hash = {
  object: {
     id: "4de7140772f8be03da000018"
  }
}

您可以组合所有这些概念,将它们转换为字符串键散列

hash.deep_transform_keys do |key|
  key = "token" if key == :id
  key.to_s
end

你可以这样做

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

这应该对你的情况有用!

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

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

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

对于Ruby 2.5或更新版本,使用transform_keys和delete_prefix / delete_suffix方法:

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"}

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

 hash.transform_keys({_id: :id})

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