我正在使用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方法 来实现
答案 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/