如何通过一组新的给定键来改变散列的所有键

如何通过一组新的给定密钥更改散列的所有密钥?

有没有办法做到这一点优雅?

我假设你想更改散列keys而不更改值:

 hash = {"nr"=>"123", "name"=>"Herrmann Hofreiter", "pferd"=>"010 000 777", "land"=>"hight land"} header = ["nr", "name", "hourse", "land"] new_hash = header.zip(hash.values).to_h 

结果:{“nr”=>“123”,“name”=>“Herrmann Hofreiter”,“hourse”=>“010 000 777”,“land”=>“high land”}

假设你有一个将旧键映射到新键的Hash ,你可以做类似的事情

 hsh.map {|k, v| [key_map[k], v] }.to_h 

确切的解决scheme将取决于您具有新密钥的格式(或者如果您可以从旧密钥中派生新密钥)。

假设你有一个你想修改密钥的散列h和一个将当前密钥映射到新密钥的hash new_keys ,你可以这样做:

 h.keys.each do |key| h[new_keys[key]] = h[key] # add entry for new key k.delete(key) # remove old key end 

另一种方法是:

 hash = { 'foo' => 1, 'bar' => 2 } new_keys = { 'foo' => 'foozle', 'bar' => 'barzle' } new_keys.values.zip(hash.values_at(*new_keys.keys)).to_h # => {"foozle"=>1, "barzle"=>2} 

打破它:

 new_keys .values # => ["foozle", "barzle"] .zip( hash.values_at(*new_keys.keys) # => [1, 2] ) # => [["foozle", 1], ["barzle", 2]] .to_h # => {"foozle"=>1, "barzle"=>2} 

这是基准时间…

虽然我喜欢Jörn的答案的简单性,但我不确定它是否应该如此快,然后我看到了selvamani的评论:

 require 'fruity' HASH = { 'foo' => 1, 'bar' => 2 } NEW_KEYS = { 'foo' => 'foozle', 'bar' => 'barzle' } compare do mittag { HASH.dup.map {|k, v| [NEW_KEYS[k], v] }.to_h } ttm { h = HASH.dup; NEW_KEYS.values.zip(h.values_at(*NEW_KEYS.keys)).to_h } selvamani { h = HASH.dup; h.keys.each { |key| h[NEW_KEYS[key]] = h.delete(key)}; h } end # >> Running each test 2048 times. Test will take about 1 second. # >> selvamani is faster than ttm by 39.99999999999999% ± 10.0% # >> ttm is faster than mittag by 10.000000000000009% ± 10.0% 

这些都是非常接近速度明智的,所以任何将会做,但39%的回报随着时间的推移,所以认为。 不包括几个答案,因为他们可能会返回不良结果的潜在缺陷。

 h = { 'foo'=>1, 'bar'=>2 } key_map = { 'foo'=>'foozle', 'bar'=>'barzle' } h.each_with_object({}) { |(k,v),g| g[key_map[k]]=v } #=> {"foozle"=>1, "barzle"=>2} 

要么

 h.reduce({}) { |g,(k,v)| g.merge(key_map[k]=>v) } #=> {"foozle"=>1, "barzle"=>2} 

如果你还担心性能,这是更快的:

 hsh.keys.each { |k| hsh[ key_map[k] ] = hsh.delete(k) if key_map[k] } 

你不创build一个新的哈希,你只重命名必要的键。 这给你更好的performance。

您可以在“ 如何优雅地重命名Ruby中的哈希中的所有键? ”中find更多详细信息。