找到两个哈希的(深)补

时间:2012-03-10 02:04:54

标签: ruby hash complement

complement是我正在寻找的数学术语,但对于上下文和可能更有针对性的解决方案:我有哈希A,它可以有嵌套的哈希(即它们是N维的),我向它申请一个进程(我无法控制),它返回散列B,这是散列A,删除了一些元素。从那时起,我试图找到A中已被删除的元素。

例如:(请注意,为简单起见,我使用符号。键始终为符号,但值不会。)

a = {:a => :b,
     :c => {:d => :e, :f => :g},
     :h => :i,
     :j => {:k => :l, :m => :n},
     :o => {:p => :q, :r => :s},
     :t => :u}

b = {:h => :i,
     :j => {:k => :l, :m => :n},
     :o => {:r => :s},
     :t => :u}

complement(a,b)
#=> {:a => :b,
#    :c => {:d => :e, :f => :g},
#    :o => {:p => :q}}

这样做的最佳(ruby-esque)方式是什么?

1 个答案:

答案 0 :(得分:1)

想出了这个

a = {a: "thing", b: [1,2,3], c:2}
b = {a: "thing", b: [1,2,3]}
c= {}
a.each do |k, v|
  c[k] = v unless b[k]
end
p c

编辑:现在检查嵌套的哈希值。但是,是的,应该有一些更好的红宝石方式来做到这一点。

def check_deleted(a, b)
    c = Hash.new
    a.each do |k, v|
        if ! b.has_key? k
            c[k] = v
        elsif b[k].is_a? Hash
            c[k] = check_deleted(v, b[k])
        end
    end
    c
end
a = {a: "thing", b: [1,2,3], c:2, d: {e: 1, r:2}}
b = {a: "thing", b: [1,2,3], d: {r:2}}

p check_deleted(a,b) #=> {:c=>2, :d=>{:e=>1}}