繁体   English   中英

如何通过 ruby​​ 中的哈希值在哈希数组中搜索?

[英]How do I search within an array of hashes by hash values in ruby?

我有一个哈希数组,@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

谢谢。

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

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

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

这将返回第一场比赛

@fathers.detect {|f| f["age"] > 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

(添加到以前的答案(希望对某人有所帮助):)

年龄更简单,但在字符串的情况下,忽略大小写:

  • 只是为了验证存在:

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

  • 查找第一个实例/索引:

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

  • 要选择所有此类索引:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM