2012-06-22 99 views
0

我有散列的數組:如何檢測值在哈希陣列

@array = [{:id => "1", :status=>"R"}, 
     {:id => "1", :status=>"R"}, 
     {:id => "1", :status=>"B"}, 
     {:id => "1", :status=>"R"}] 

如何檢測,是否包含在狀態「B」的哈希值?像簡單的數組:

@array = ["R","R","B","R"] 
puts "Contain B" if @array.include?("B") 

回答

6

使用any?

@array.any? { |h| h[:status] == "B" } 
2

陣列(實際上可枚舉)有一個detect方法。如果它沒有檢測到任何東西,它會返回一個nil,所以你可以像Andrew Marshall的any那樣使用它。

@array = [{:id => "1", :status=>"R"}, 
     {:id => "1", :status=>"R"}, 
     {:id => "1", :status=>"B"}, 
     {:id => "1", :status=>"R"}] 
puts "Has status B" if @array.detect{|h| h[:status] == 'B'} 
+1

如果我關心如何找到符合條件的值,我只會真的在'any'上使用'detect',但它肯定可以用作謂詞方法。 (1) –

0

我想補充一下steenslag說:

detect並不總是返回零。

如果detect不檢測(找到)某個項目,則可以傳入一個lambda來執行(調用)。換句話說,如果它不能檢測(找到)某些東西,你可以告訴detect該做什麼。

要添加到您的示例:

not_found = lambda { "uh oh. couldn't detect anything!"} 
# try to find something that isn't in the Enumerable object: 
@array.detect(not_found) {|h| h[:status] == 'X'} 

將返回"uh oh. couldn't detect anything!"

這意味着,你不必寫這樣的代碼:

if (result = @array.detect {|h| h[:status] == 'X'}).nil? 
    # show some error, do something here to handle it 
    # (this would be the behavior you'd put into your lambda) 
else 
    # deal nicely with the result 
end 

這是一個主要的區別在any?detect之間 - 你不能告訴any?如果找不到任何項目,該怎麼辦。

這是在Enumerable類中。 ref:http://ruby-doc.org/core/classes/Enumerable.html#M003123