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

问题描述 投票:19回答:6

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

说我有那些哈希:

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

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

我想检查hash1是否包括在hash2中,即使在hash2中有比hash1更多的值(在上面的例子中,我正在寻找的响应应该是true)?是否可以通过使用“一个唯一的代码行”\“一个Ruby方法”来做到这一点?

ruby-on-rails ruby ruby-on-rails-3 methods hash
6个回答
38
投票

那就足够了

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

4
投票

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

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

3
投票

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

例如重写哈希包括?实例方法。

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

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

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

0
投票

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

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


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#<=方法。

© www.soinside.com 2019 - 2024. All rights reserved.