2011-09-28 75 views
18

我正在使用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方法」來做到這一點?我能想到的是

+1

也許你可以將hash1合併到hash2('hash2.merge(hash1)'),看看它是否改變。這是一種非常幼稚的做法,但如果它是你想要的一行代碼,那可能是最簡單的方法。 – 2011-09-28 14:37:46

回答

33

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

不錯。這就是爲什麼我在我的答案中加入了「我能想到的」部分;-) –

+0

太棒了!我只花了一個小時玩**收集** **包括** ** values_at **和朋友......沒有合理的結果。終於打這個答案。很簡單。 – Kocur4d

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 
3

最簡單的方法:這將是足夠的

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

我不知道我的理解中的散列列入想法。 看看它是否有相同的鍵(通常的問題)。 在HASH1所有按鍵都包含在HASH2: hash1.keys - hash2.keys == []

然後,如果你要比較這些值做的建議在以前的帖子: hash1.values - hash2.values_at (* hash1.keys)== []

3

更優雅的方法是在一個散列合併另一個時檢查相等性。

例如重寫哈希包括?實例方法。

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

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