如何在ruby中按哈希值在哈希数组中搜索?


234

我有一系列哈希,@ 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 

我如何搜索该数组并返回一个哈希数组,对于该数组,块返回true?

例如:

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

谢谢。

Answers:


419

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

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

根据文档,它“返回一个数组,该数组包含[blockable @fathers不是false 的[可枚举,在这种情况下] 所有元素。”


22
哦! 你是第一个!删除我的答案和+1。
米兰诺沃塔2010年

20
注意,如果只想查找一个(第一个),则可以@fathers.find {|father| father["age"] > 35 }改用。
Leigh McCulloch 2014年

1
是否可以返回在原始哈希数组中找到该索引的位置?
伊恩·华纳

1
@IanWarner是的。我建议查看Enumerable模块的文档。如果仍然无法解决,请发布新问题。
乔丹(Jordan)

我刚刚做了这个索引= ARRAY.index {| h | h [:code] == ARRAY [“ code”]}
Ian Warner

198

这将返回第一个比赛

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

6
我更喜欢这个#select-但是一切都适合您的用例。如果找不到匹配项,则#detect返回nil,而#select在@Jordan的答案中,将返回[]
TJ Biddle

13
你也可以使用find,而不是detect一个更可读的代码
阿尔特拉各斯

8
find可能会使您感到困惑。
user12341234

5
selectdetect不相同,select将横切整个数组,而detect在找到第一个匹配项后立即停止。如果您要寻找一场比赛, @fathers.select {|f| f["age"] > 35 }.first以求 @fathers.detect {|f| f["age"] > 35 } 提高性能和可读性,我的投票投了detect
Naveed

35

如果你的数组看起来像

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,则将返回对象,否则返回nil


如果名称是小写字母,例如"hitesh",则不会返回哈希值。在这种情况下,我们也该如何解释单词大小写?
arjun

2
您可以使用类似的东西。array.find {| x | x [:name] .downcase ==“ Hitesh” .downcase}
Hitesh Ranaut
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.