我有两个哈希,以下格式
mydetails[x['Id']] = x['Amount']
这将包含
之类的数据hash1 = {"A"=>"0", "B"=>"1","C"=>"0", "F"=>"1"}
hash2 = {"A"=>"0", "B"=>"3","C"=>"0", "E"=>"1"}
我期望输出类似:
哈希的差异:" b,f,e"
任何帮助都非常感谢。
此解决方案可能更容易理解:
(hash1.keys | hash2.keys).select{ |key| hash1[key] != hash2[key] }
Array#|
返回2个数组的集合。相当于:
(hash1.key + hash2.keys).uniq
注意:如果要考虑{}
和{b: nil}
在:b
上有所不同,即使它们返回:b
密钥的相同值:
(hash1.keys | hash2.keys).reject do |key|
hash1.has_key?(key) &&
hash2.has_key?(key) &&
hash1[key] == hash2[key]
end
Hash#merge
带有一个块将做:
hash1.merge(hash2) { |k, v1, v2| v1 == v2 ? :equal : [v1, v2] }
.reject { |_, v| v == :equal }
.keys
#⇒ ["B", "F", "E"]
注意:即使对于包含:equal
值的哈希(以解决下面的评论),这将起作用,因为合并结果将包含[:equal, nil]
的值,而不仅仅是值:equal
。但是,为了简化整个过程并避免混乱,在Ruby 2.4 中,您可以使用hash#紧凑:
hash1.merge(hash2) { |_k, v1, v2| v1 == v2 ? nil : :different }
.compact.keys