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

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

我想让这个散列

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

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


当前回答

对于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.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"}

准确地回答了问题:

hash = {"_id"=>"4de7140772f8be03da000018"}
hash.transform_keys { |key| key[1..] }
# => {"id"=>"4de7140772f8be03da000018"}

从Ruby 2.5版开始,transform_keys方法就存在于Hash类中。

https://blog.bigbinary.com/2018/01/09/ruby-2-5-adds-hash-transform_keys-method.html

如果我们想在哈希中重命名一个特定的键,那么我们可以这样做: 假设我的哈希是my_hash = {'test' => 'ruby哈希演示'} 现在我想用'message'替换'test',然后: My_hash ['message'] = My_hash .delete('test')

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

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

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

你可以这样做

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

这应该对你的情况有用!