回答
我假定要更改的哈希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”,“名称“=>”Herrmann Hofreiter“,”hourse“=>”010 000 777“,”land“=>”高地“}
确切的解决方案将取决于格式,你必须在新的键(或者,如果你能得到从旧的密钥新的密钥。)
假设你有一个哈希要修改h
,它的键和散列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
这将删除'key'的值, new_keys'不小心碰巧返回'key'本身的某个'key'。 barbolos的这个问题的答案:http://stackoverflow.com/questions/4137824克服了这个问题。 – sawa 2012-10-24 11:06:26
代替这个,你可以使用'h.keys.each {| key | h [new_keys [key]] = h.delete(key)}' – Selvamani 2015-10-16 05:16:23
@Selvamani,查看我的答案,并从您的评论中创建答案。 – 2016-03-28 22:58:39
假设你有一个Hash
其旧键映射到新键,你可以不喜欢
hsh.map {|k, v| [key_map[k], v] }.to_h
你是男人!你的hash是完全可怕的!再次感谢这宝石!:) – CalebHC 2011-09-23 22:55:00
它还假定您有'key_map'定义为键/值对的哈希,其中键是旧键,值是正在交换的新键。 – 2016-03-28 22:35:50
如果你还担心性能,这是速度快:
hsh.keys.each { |k| hsh[ key_map[k] ] = hsh.delete(k) if key_map[k] }
你不创建一个新的Hash,你只重命名必需的密钥。这给你更好的表现。
如果'key_map [k]'为零。 – 2016-03-28 22:32:20
更多详情另一种方式来做到这一点是:
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}
它的基准时间.. 。
虽然我喜欢乔恩的回答简单,我不知道这是因为快,因为它应该是,然后我看到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}
我认为为每个键调用合并会比较慢 – Josh 2017-10-24 04:38:49
@Josh,你是对的。我用添加的两种方法重新运行@TinMan的基准测试,并得到以下结果:“selvamani比ttm快19.99%±1.0%; ttm与caryewo相似(使用'each_with_object'); caryewo与mittag相似; mittag比使用“减少”的速度快70.0%±10.0%“。 – 2017-10-24 05:29:16
- 1. 映射,通过密钥的散列/值
- 2. 如何获得列表中所有密钥的密钥列表?
- 3. 密钥散列:Facebook的SDK
- 4. Android的密钥散列
- 5. 带密钥的SHA512散列
- 6. 如何通过其他密钥通过相同的密钥和组求和值
- 7. 通过密钥
- 8. 如何搜索密钥的散列
- 9. 将新值赋给散列表中的现有密钥
- 10. Redis,如何通过它的密钥查询散列数据
- 11. 如何使用PCLCrypto中的现有密钥来散列密码?
- 12. 如何通过API密钥
- 13. 密钥库更改密码
- 14. 密钥散列格式
- 15. 散列函数和密钥
- 16. 如何迭代一组来列出所有的密钥?
- 17. Android中的调试密钥库散列密钥失败
- 18. 在散列表中修改密钥?
- 19. Gson更改密钥
- 20. 使用带有2个密钥的重复密钥更新
- 21. 如何从现有密钥设置新密钥:defaultdict的值对?
- 22. 通过密钥库
- 23. 密钥不唯一,更新非密钥属性上的行时?
- 24. 通过匹配的密钥
- 25. 通过相同的密钥
- 26. 萨姆2散列用同一密钥
- 27. Firebase中的更新密钥
- 28. 如何根据指定给另一个字典中相同密钥的值更改字典密钥?
- 29. lodash的mapValues所有密钥
- 30. 阵列不是为给定的密钥
一段时间的自我提升☺️,但只是把它留在这里:如果需要更复杂一点(比如同时选择特定的键或胁迫值的类型等),我将一个小小的lib:https ://github.com/smileart/hash_remapper – smileart 2017-12-05 20:49:09