我有一个哈希数组@fathers。

a_father = { "father" => "Bob", "age" =>  40 }
@fathers << a_father
a_father = { "father" => "David", "age" =>  32 }
@fathers << a_father
a_father = { "father" => "Batman", "age" =>  50 }
@fathers << a_father 

我如何搜索这个数组,并返回一个哈希数组,其中一个块返回真?

例如:

@fathers.some_method("age" > 35) #=> array containing the hashes of bob and batman

谢谢。


当前回答

你正在寻找Enumerable#select(也称为find_all):

@fathers.select {|father| father["age"] > 35 }
# => [ { "age" => 40, "father" => "Bob" },
#      { "age" => 50, "father" => "Batman" } ]

根据文档,它“返回一个数组,其中包含块不为false的[可枚举对象,在本例中为@fathers]的所有元素。”

其他回答

如果你的数组看起来像

array = [
 {:name => "Hitesh" , :age => 27 , :place => "xyz"} ,
 {:name => "John" , :age => 26 , :place => "xtz"} ,
 {:name => "Anil" , :age => 26 , :place => "xsz"} 
]

你想知道数组中是否已经存在某个值。使用查找方法

array.find {|x| x[:name] == "Hitesh"}

如果Hitesh在name中存在,则返回object,否则返回nil

这将返回第一个匹配项

@fathers.detect {|f| f["age"] > 35 }

你正在寻找Enumerable#select(也称为find_all):

@fathers.select {|father| father["age"] > 35 }
# => [ { "age" => 40, "father" => "Bob" },
#      { "age" => 50, "father" => "Batman" } ]

根据文档,它“返回一个数组,其中包含块不为false的[可枚举对象,在本例中为@fathers]的所有元素。”

(补充之前的答案(希望能帮助到一些人):)

Age更简单,但在大小写字符串和忽略大小写:

为了验证它的存在:

@fathers.any吗?{|father| father[:name].casecmp("john") == 0}应该适用于字符串开头的任何情况或字符串中的任何位置,即"john", "john"或"john"等。

查找第一个实例/索引:

@fathers。查找{|父|父[:name].casecmp("john") == 0}

要选择所有这些索引:

@fathers。Select {|father| father[:name].casecmp("john") == 0}