我有像Ruby这样的两个哈希
hash1={"a" = > "b"}
hash2={:a => "c" }
当我在做的时候 hash1.merge!(hash2)我得到结果为
{"a"=>"b", :a=>"c"}
我希望得到{"a" => "c"}
的结果基本上我希望ruby将符号和字符串视为键值相同。
我正在调查Hash类,但找不到任何方法。
问题是如何合并以使上述操作的结果为{“a”=> “C”}。
答案 0 :(得分:5)
Rails的ActiveSupport gem有stringify_keys
(参见:http://apidock.com/rails/Hash/stringify_keys)方法来完成这项工作:
require 'active_support/hash_with_indifferent_access'
hash1 = { "a" => "b" }
hash2 = { :a => "c" }
hash1.merge(hash2.stringify_keys)
# => { "a" => "c" }
这就是宝石内部(简化)的作用:
class Hash
def stringify_keys
{}.tap do |result|
each_key { |key| result[key.to_s] = self[key] }
end
end
end
答案 1 :(得分:2)
您可以将哈希键规范化为相同类型(即to_s
或to_sym
)并合并:
h = lambda { |h| Hash[h.map{ |k,v| [k.to_s, v] }] }
hash1 = h.call(hash1)
hash2 = h.call(hash2)
hash1.merge!(hash2)
或者用速记来定义lambda:
h = -> (h) { Hash[h.map{ |k,v| [k.to_s, v] }] }
答案 2 :(得分:0)
鉴于您要修改hash1
(而不是创建新哈希),您可以这样做:
hash1 = { "a" => "b", "d" => "e" }
hash2 = { :a => "c", :f => "g", :h => "i", "j" => "k" }
stringify = [ :a, :f ]
hash2.each { |k,v| hash1[stringify.include?(k) ? k.to_s : k] = v }
hash1
#=> {"a"=>"c", "d"=>"e", "f"=>"g", :h=>"i", "j"=>"k"}
如果hash2
中符号中的所有键都要转换为字符串:
hash2.each { |k,v| hash1[k.to_s] = v }
hash1
#=> {"a"=>"c", "d"=>"e", "f"=>"g", "h"=>"i", "j"=>"k"}