如何检查一个哈希是不是“完全”包含在另一个哈希中?
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#<=
方法。
【讨论】:
【参考方案6】:我不确定我是否理解哈希中的包含概念。 查看它是否具有相同的键(通常的问题)。 hash1 中的所有键都包含在 hash2 中: hash1.keys - hash2.keys == []
然后,如果您想比较这些值,请按照上一篇文章中的建议进行操作: hash1.values - hash2.values_at(*hash1.keys) == []
【讨论】:
以上是关于如何检查一个哈希是不是“完全”包含在另一个哈希中?的主要内容,如果未能解决你的问题,请参考以下文章