我有一系列哈希:
@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")
答案 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?
detect
和any?
之间的一个主要区别 - 如果找不到任何项目,您无法告诉{{1}}该做什么
这是在Enumerable类中。参考:http://ruby-doc.org/core/classes/Enumerable.html#M003123