我有两个哈希 -
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"}
也就是说,我需要比较两个哈希值,只留下键相等且两个哈希值都存在的值。
答案 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中删除。