Ruby on rails 如何用另一个密钥替换哈希密钥

Ruby on rails 如何用另一个密钥替换哈希密钥,ruby-on-rails,ruby,ruby-on-rails-3,hash,Ruby On Rails,Ruby,Ruby On Rails 3,Hash,我有一个条件,我得到一个散列 hash = {"_id"=>"4de7140772f8be03da000018", .....} 我想要这个杂烩 hash = {"id"=>"4de7140772f8be03da000018", ......} p.S:我不知道散列中的键是什么,它们是随机的,每个键都有一个“u”前缀,我不需要下划线 hash.inject({}){|option, (k,v) | option["id"] = v if k == "_id"; optio

我有一个条件,我得到一个散列

  hash = {"_id"=>"4de7140772f8be03da000018", .....}
我想要这个杂烩

  hash = {"id"=>"4de7140772f8be03da000018", ......}
p.S:我不知道散列中的键是什么,它们是随机的,每个键都有一个“u”前缀,我不需要下划线

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

这应该适合你的情况

如果所有键都是字符串,并且所有键都有下划线前缀,则可以使用以下内容修补哈希:

h.keys.each { |k| h[k[1, k.length - 1]] = h[k]; h.delete(k) }
该位获取除第一个字符外的所有
k
。如果您想要一份副本,那么:

new_h = Hash[h.map { |k, v| [k[1, k.length - 1], v] }]

如果您不喜欢使用
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 }

对于没有下划线前缀的键,无需进行额外修改即可使用。

如果要重命名哈希中的特定键,则可以按如下方式进行操作:
h.inject({}) { |m, (k,v)| m[k.sub(/^_/,'')] = v; m }

假设我的散列是
my_hash={'test'=>'ruby hash demo'}

现在我想将“test”替换为“message”,然后:

my\u hash['message']=my\u hash.delete('test')

rails hash有标准的方法:

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


UPD:ruby 2.5方法

我做得太过火了,想出了以下方法。我这样做的动机是在合并/展平散列时附加到散列键以避免范围冲突

例子 扩展散列类 向哈希实例添加重新设置密钥的方法

#向散列添加其他方法
类::哈希
#更改散列上的键
#获取传递当前关键帧的块
#块返回的任何内容都将成为新的键
#如果为密钥返回哈希,它将合并当前哈希
#使用块中返回的哈希。这允许嵌套的重新键控。
def rekey
self.each_with_object({})do|(key,value),previous|
新密钥=收益率(密钥,值)
如果新的\u键是\u?(散列)
上一个。合并!(新钥匙)
其他的
上一个[新_键]=值
终止
终止
终止
终止
前置示例
我对冰淇淋的感觉={
香草:“美味”,
巧克力:“太巧克力了”,
草莓:“没关系……”
}
我对冰淇淋的感觉
#=>{:香草冰淇淋=>“美味”,:巧克力冰淇淋=>“太巧克力了”,:草莓冰淇淋=>“很好…”
修剪示例
{u id:1,{u__________________:‘什么?!’}|
修剪=关键点至第tr页(“”,“”)
修剪到_sym
终止
#=>{:id=>1,:something=>“什么?!”}
展平并附加“范围” 如果您将散列传递回重新设置密钥,它将合并散列,从而使您可以展平集合。这允许我们在展平散列时为键添加作用域,以避免在合并时覆盖键

人={
鲍勃:{
姓名:'鲍勃',
玩具:[
{什么:'车',颜色:'红'},
{什么:'球',颜色:'蓝'}
]
},
汤姆:{
名字:“汤姆”,
玩具:[
{什么:'房子',颜色:'蓝色;大巴地大巴地'},
{什么:'nerf gun',颜色:'metallic'}
]
}
}
people.rekey do |个人,个人信息|
人员_info.rekey do | key|
“{person}{key}”to_sym
终止
终止
# =>
# {
#:bob_name=>“bob”,
#:bob_toys=>[
#{:what=>“car”,:color=>“red”},
#{:what=>“ball”,:color=>“blue”}
#   ],
#:tom_name=>“tom”,
#:tom_玩具=>[
#{:what=>“house”,:color=>“blue;daba dee daba die”},
#{:what=>“nerf gun”,“color=>“metallic”}
#   ]
# }

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

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

首先,它将忽略键“\u id”,然后与更新的键合并。

准确回答问题:

hash = {"_id"=>"4de7140772f8be03da000018"}
hash.transform_keys { |key| key[1..] }
# => {"id"=>"4de7140772f8be03da000018"}
自Ruby 2.5版以来,Hash类中存在方法
transform\u keys

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

hash1={'\u id'=>random1'}
hash2={'old_first'=>'123456','old_second'=>'234567'}
hash3={'first_-com'=>'google.com','second_-com'=>'amazon.com'}
hash1.transform_keys{| key | key.delete_前缀(''')}
#=>{“id”=>“random1”}
hash2.transform_keys{| key | key.delete_前缀('old|')}
#=>{“第一”=>“123456”,“第二”=>“234567”}
hash3.transform_keys{| key | key.delete_后缀('u com')}
#=>{“第一”=>“google.com”,“第二”=>“amazon.com”}

你的答案有效,但在沃德之后,我发现像这样的散列很少有{“id”=>“4DE7140772F8BE03DA00018”,“类型”=>“工作站”,“创建于”=>“2011-06-02T10:24:35+05:45”,“输入头id”=>[],“行id”=>“4de7140472f8be03da000017”,“更新于”=>“2011-06-02T10:24:35+05:45”}{“id”=>“4DE7140772FA00018”,“创建于”=>“2011-06-02T10:24:35+05:45”,“nput_header_id”=>[],“ine_id”=>“4de7140472f8be03da000017”,“pdated_at”=>“2011-06-02T10:24:35+05:45”}@Manish:我说过“如果所有键都是字符串,并且所有键都有下划线前缀”。我在更新中包含了一个“没有下划线前缀的键”的示例方法。@Manish:“k”代表“键”,“v”“表示“值”,“x”表示“我不知道怎么称呼它,但我受过数学家的训练,所以我称它为x”。我喜欢你尝试使用正则表达式来正确过滤下划线,但你应该知道,在ruby中,与javascript和其他语言不同,/^/表示“字符串或行的开始”,而/$/表示“字符串或行的结束”。在这种情况下,键中不太可能有换行符,但是您应该注意,在ruby中使用这两个操作符不仅容易出错,而且在针对注入的验证中使用错误时也非常危险。请参阅以获取解释。希望你不介意传播这种意识。这可能会帮助你:+1获得有用的信息question@a5his:我很高兴它能帮上忙:)相关:你的答案对我的问题有什么帮助?如果您认为这是有帮助的,那么您可以在问题下添加评论。我的曲
hash.transform_keys{ |key| key.to_s.upcase }
 newhash=hash.reject{|k| k=='_id'}.merge({id:hash['_id']})
hash = {"_id"=>"4de7140772f8be03da000018"}
hash.transform_keys { |key| key[1..] }
# => {"id"=>"4de7140772f8be03da000018"}