ルビのハッシュ値でハッシュの配列内を検索するにはどうすればよいですか?


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

ありがとう。

回答:


419

あなたはEnumerable#select(別名find_all)を探しています

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

ドキュメントによれば、「@fathersブロックがfalseでない[enumerable、この場合は]のすべての要素を含む配列を返します。」


22
ああ!あなたが最初の人でした!回答を削除して+1します。
ミラノノボタ2010

20
注として、1つ(最初の1つ)のみを検索する場合は、@fathers.find {|father| father["age"] > 35 }代わりに使用できます。
Leigh McCulloch 2014年

1
ハッシュの元の配列でこれが見つかった場所のインデックスを返すことは可能ですか?
Ian Warner

1
@IanWarnerはい。Enumerableモジュールのドキュメントを確認することをお勧めします。それでもわからない場合は、新しい質問を投稿してください。
ジョーダンが2016年

このインデックスを作成しました= ARRAY.index {| h | h [:code] == ARRAY ["code"]}
Ian Warner

198

これは最初の一致を返します

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

6
私はこれよりも好きです#select-しかし、すべてあなたのユースケースに行きます。一致が見つからない場合は#detectが返され、@ジョーダンの回答ではが返されます。nil#select[]
TJ Biddle 2013

13
より読みやすいコードのfind代わりに使用することもできdetectます
Alter Lagos

8
findただし、レールでは混乱する可能性があります。
user12341234 2015年

5
selectdetectselect異なりdetect、最初の一致が見つかるとすぐに停止しながら、配列全体を横断します。あなたはONE試合を探しているなら @fathers.select {|f| f["age"] > 35 }.first、VS @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"} 
]

そして、何らかの値が配列にすでに存在しているかどうかを知りたいとします。Findメソッドを使用

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

名前にHiteshが存在する場合はオブジェクトを返し、それ以外の場合はnilを返します


名前がのように小文字だった場合、"hitesh"ハッシュは返されません。そのような場合、大文字小文字をどのように説明できますか?
arjun

2
次のようなものを使用できます。array.find {| x | x [:name] .downcase == "Hitesh" .downcase}
Hitesh Ranaut
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.