如何检测哈希数组中的值

时间:2012-06-22 14:41:11

标签: ruby

我有一系列哈希:

@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")

3 个答案:

答案 0 :(得分:6)

使用any?

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

答案 1 :(得分:2)

Arrays(实际上是enumerables)有一个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'}

答案 2 :(得分:0)

只是添加steenslag说的话:

detect 并不总是返回nil。

如果检测不能检测到'你可以传入一个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?

detectany?之间的一个主要区别 - 如果找不到任何项目,您无法告诉{{1}}该做什么

这是在Enumerable类中。参考:http://ruby-doc.org/core/classes/Enumerable.html#M003123