如何比较哈希值和输出重复项?

时间:2013-02-13 12:11:39

标签: ruby hash

我有三个哈希值,并希望输出它们共有的键:

hash1 = {a: "3", b: "2" c: "1"}
hash2 = {b: "2" c: "1"}
hash3 = {b: "2" c: "1", d: "4"}

对于上面的示例,公共密钥为bc

我需要将其缩放到许多哈希值。什么是最有效和可扩展的方法?

2 个答案:

答案 0 :(得分:3)

> hashes = [{a: 3, b: 4}, {a: 5, c: 6}, {a: 6, d: 2}]
=> [{:a=>3, :b=>4}, {:a=>5, :c=>6}, {:a=>6, :d=>2}]
> hashes.map(&:keys).inject { |shared, keys| shared & keys }
=> [:a]

答案 1 :(得分:3)

是的,你需要像Hash#intersect这样的东西。幸运的是,实施起来很简单。

class Hash
  def & another
    result = {}
    self.each do |k, v|
      result[k] = v if another[k] == v
    end
    result
  end
end

hash1 = {a: "3", b: "2", c: "1"}
hash2 = {b: "2", c: "1"}
hash3 = {b: "2", c: "1", d: "4"}

hashes = [hash1, hash2, hash3]


hashes.reduce(:&) # => {:b=>"2", :c=>"1"}

注意:此代码假定键必须匹配才能传递过滤器。如果你只对键本身感兴趣,那么修改代码就很容易了。我会留给你的。