红宝石中两个哈希之间的变化

时间:2016-12-20 13:47:58

标签: ruby-on-rails ruby

我有两个以下格式的哈希

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"

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:6)

带有块的

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#compact:

hash1.merge(hash2) { |_k, v1, v2| v1 == v2 ? nil : :different }
     .compact.keys

答案 1 :(得分:6)

这个解决方案可能更容易理解:

(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