Ruby:比较两个哈希

我有两个哈希 –

hash1 = {a: "2", b: "34", c: "53", d: "23", e: "2"} hash2 = {a: "5", c: "8", d: "3", e: "2", f: "76"} 

我需要比较哈希并得到下一个 –

 hash1_1 = {a: "2", c: "53", d: "23", e: "2"} hash2_1 = {a: "5", c: "8", d: "3", e: "2"} 

也就是说,我需要比较两个哈希值,只留下键相等且两个哈希值都存在的值。

我会这样做:

 hash1 = {a: "2", b: "34", c: "53", d: "23", e: "2"} hash2 = {a: "5", c: "8", d: "3", e: "2", f: "76"} hash1_1 = hash1.select{|k,_| hash2.has_key? k} # => {:a=>"2", :c=>"53", :d=>"23", :e=>"2"} hash1_2 = hash2.select{|k,_| hash1.has_key? k} # => {:a=>"5", :c=>"8", :d=>"3", :e=>"2"} 

您可以使用set intersection,keys和Hash#select

 first = {a: 1, c: 2, e: 3, g: 4} second = {a: 2, b: 3, c: 4, g: 5} intersection = first.keys & second.keys # => [:a, :c, :g] [first, second].map! { |h| h.select { |k, _| intersection.include? k } } first # => {:a=>1, :c=>2, :e=>3, :g=>4} second # => {:a=>2, :b=>3, :c=>4, :g=>5} 

做如下:

 hash1 = {a: "2", b: "34", c: "53", d: "23", e: "2"} hash2 = {a: "5", c: "8", d: "3", e: "2", f: "76"} keys = ( hash1.keys & hash2.keys ) hash1_1 = hash1.select {| k,_ | keys.include? k } # => {:a=>"2", :c=>"53", :d=>"23", :e=>"2"} hash2_1 = hash2.select {| k,_ | keys.include? k } # => {:a=>"5", :c=>"8", :d=>"3", :e=>"2"} 

略有不同的方法

 hash1 = {a: "2", b: "34", c: "53", d: "23", e: "2"} hash2 = {a: "5", c: "8", d: "3", e: "2", f: "76"} diff1 = (hash1.keys - hash2.keys) # => [:b] diff2 = (hash2.keys - hash1.keys) # => [:f] hash1_1 = hash1.dup diff1.each{|k| hash1_1.delete(k)} hash1_1 # => {:a=>"2", :c=>"53", :d=>"23", :e=>"2"} hash2_1 = hash2.dup diff2.each{|k| hash2_1.delete(k)} hash2_1 # => {:a=>"5", :c=>"8", :d=>"3", :e=>"2"} 

如果您不需要原始的hash1和hash2,则可以跳过dup并直接从hash1和hash2中删除。