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

Posted

技术标签:

【中文标题】如何检查一个哈希是不是“完全”包含在另一个哈希中?【英文标题】:How to check if an hash is "completely" included in another hash?如何检查一个哈希是否“完全”包含在另一个哈希中? 【发布时间】:2011-11-26 22:34:53 【问题描述】:

我正在使用 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(在上述情况下,我正在寻找的响应应该是@ 987654326@)? 是否有可能使用“一行代码”\“一个 Ruby 方法”

【问题讨论】:

也许你可以将 hash1 合并到 hash2 (hash2.merge(hash1)) 中看看它是否改变了。这是一种非常幼稚的方法,但如果它是你想要的一行代码,它可能是最简单的方法。 【参考方案1】:

这就够了

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

【讨论】:

不错。这就是为什么我在答案中添加了“我能想到的”部分;-) 太棒了!我刚刚花了一个小时与 collect include? values_at 和朋友们一起玩......没有合理的结果。终于找到了这个答案。如此简单。【参考方案2】:

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

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

【讨论】:

【参考方案4】:

有办法:

hash_2 >= hash_1

或者:

hash_1 <= hash_2

这篇文章的更多信息:https://olivierlacan.com/posts/proposal-for-a-better-ruby-hash-include/

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

以上是关于如何检查一个哈希是不是“完全”包含在另一个哈希中?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查哈希中是不是存在特定值?

检查哈希表数组是不是包含哈希表

Ruby Style:如何检查嵌套的哈希元素是不是存在

Ruby Style:如何检查嵌套的哈希元素是不是存在

如何检查哈希中是不是存在特定键?

如何递归检查ruby hash成员是不是存在?