如何检查散列是否“完全”包含在另一个散列中?
我正在使用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方法”来做到这一点?我能想到的是
(hash1.to_a - hash2.to_a).empty?
不错。这就是为什么我在我的答案中加入了“我能想到的”部分;-) –
太棒了!我只花了一个小时玩**收集** **包括** ** values_at **和朋友......没有合理的结果。终于打这个答案。很简单。 – Kocur4d
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
最简单的方法:这将是足够的
hash2.values_at(*hash1.keys) == hash1.values
我不知道我的理解中的散列列入想法。 看看它是否有相同的键(通常的问题)。 在HASH1所有按键都包含在HASH2: hash1.keys - hash2.keys == []
然后,如果你要比较这些值做的建议在以前的帖子: hash1.values - hash2.values_at (* hash1.keys)== []
更优雅的方法是在一个散列合并另一个时检查相等性。
例如重写哈希包括?实例方法。
class Hash
def include?(other)
self.merge(other) == self
end
end
{:a => 1, :b => 2, :c => 3}.include? :a => 1, :b => 2 # => true
也许你可以将hash1合并到hash2('hash2.merge(hash1)'),看看它是否改变。这是一种非常幼稚的做法,但如果它是你想要的一行代码,那可能是最简单的方法。 – 2011-09-28 14:37:46