Ruby:比较两个哈希

时间:2013-12-14 07:29:45

标签: ruby-on-rails 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"}

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

4 个答案:

答案 0 :(得分:4)

我会这样做:

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"}

答案 1 :(得分:3)

您可以使用集合交集,键和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}

答案 2 :(得分:1)

请执行以下操作:

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"}

答案 3 :(得分:1)

略有不同的方法

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中删除。