如何检查哈希是否“完全”包含在另一个哈希中?

时间:2011-09-28 14:26:08

标签: ruby-on-rails ruby ruby-on-rails-3 methods hash

我正在使用Ruby on Rails 3.1.0,我想检查散列是否“完全”包含在另一个散列中并返回 boolean 值。

说我有那些哈希:

hash1 = {
  :key1 => 'value1',
  :key2 => 'value2',
  :key3 => 'value3'
}

hash2 = {
  :key1 => 'value1',
  :key2 => 'value2',
  :key3 => 'value3',
  :key4 => 'value4',
  :key5 => 'value5',
  ...
}

我想检查hash1是否包含在hash2中,即使在hash2中的值多于hash1(在上述情况下为响应)我正在寻找的应该是true)? 是否可以通过使用“一个唯一的代码行”\“一个Ruby方法 来实现

7 个答案:

答案 0 :(得分:37)

这就够了

(hash1.to_a - hash2.to_a).empty?

答案 1 :(得分:4)

我能想到的最简单的方法是:

hash2.values_at(*hash1.keys) == hash1.values

答案 2 :(得分:3)

更优雅的方法是在一个哈希合并另一个哈希时检查相等性。

e.g。重写哈希包括?实例方法。

class Hash
  def include?(other)
    self.merge(other) == self
  end
end

{:a => 1, :b => 2, :c => 3}.include? :a => 1, :b => 2 # => true

答案 3 :(得分:2)

class Hash
  def included_in?(another)
    # another has to have all my keys...
    return false unless (keys - another.keys).empty?
    # ..and have the same value for every my key
    each do |k,v|
      return false unless v == another[k]
    end
    true
  end
end

hash1.included_in?(hash2) # => true
hash2.included_in?(hash1) # => false

答案 4 :(得分:0)

我不确定我是否理解哈希中的包含思想。 查看它是否具有相同的键(通常的问题)。 hash1中的所有键都包含在hash2中: hash1.keys - hash2.keys == []

然后,如果你想比较这些值,请按照上一篇文章中的建议进行: hash1.values - hash2.values_at(* hash1.keys)== []

答案 5 :(得分:0)

我发现的最有效,最优雅的解决方案-没有中间数组或冗余循环。

class Hash
  alias_method :include_key?, :include?

  def include?(other)
    return include_key?(other) unless other.is_a?(Hash)
    other.all? do |key, value|
      self[key] == value
    end
  end
end

从Ruby 2.3开始,您可以使用内置的Hash#<=方法。

答案 6 :(得分:0)

有一种方法:

hash_2 >= hash_1

或者:

hash_1 <= hash_2

此信息中的更多信息:https://olivierlacan.com/posts/proposal-for-a-better-ruby-hash-include/