我不确定您要进行哪些比较,因此我将展示回答不同问题的方法。您想对两个散列数组进行成对比较,但这实际上并不比仅比较两个散列更困难,我稍后会展示。现在,假设您只想比较两个哈希:
h1 = {:a=>1, :b=>4, :c=>2, :d=>3 }
h2 = {:a=>1, :b=>1, :c=>2, :e=>5 }
h1 或 h2(或两者)中有哪些键?
h1.keys | h2.keys
#=> [:a, :b, :c, :d, :e]
见Array#|。
两个哈希中的键是什么?
h1.keys & h2.keys
#=> [:a, :b, :c]
见Array#&。
h1 中有哪些键,h2 中没有?
h1.keys - h2.keys
#=> [:d]
见Array#-。
h2 中有哪些键,h1 中没有?
h2.keys - h1.keys #=> [:e]
哪些键只在一个哈希中?
(h1.keys - h2.keys) | (h2.keys - h1.keys)
#=> [:d, :e]
或
(h1.keys | h2.keys) - (h1.keys & h2.keys)
哪些键在两个哈希中并且在两个哈希中具有相同的值?
(h1.keys & h2.keys).select { |k| h1[k] == h2[k] }
#=> [:a, :c]
见Array#select。
什么键在两个哈希中并且在两个哈希中具有不同的值?
(h1.keys & h2.keys).reject { |k| h1[k] == h2[k] }
#=> [:b]
假设现在我们有两个哈希数组:
a1 = [{:a=>1, :b=>4, :c=>2, :d=>3 }, {:a=>2, :b=>1, :c=>3, :d=>4}]
a2 = [{:a=>1, :b=>1, :c=>2, :e=>5 }, {:a=>1, :b=>3, :c=>3, :e=> 6}]
并希望成对比较哈希值。要做到这一点,首先需要上面感兴趣的计算并将其包装在一个方法中。例如:
def keys_in_both_with_different_values(h1, h2)
(h1.keys & h2.keys).reject { |k| h1[k] == h2[k] }
end
然后写:
a1.zip(a2).map { |h1,h2| keys_in_both_with_different_values(h1, h2) }
#=> [[:b], [:a, :b]]
见Enumerable#zip。