Bagaimana cara mencari di dalam array hash dengan nilai hash di ruby?

234

Saya memiliki berbagai hash, @ ayah.

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 

Bagaimana saya bisa mencari array ini dan mengembalikan array hash yang mana sebuah blok mengembalikan true?

Sebagai contoh:

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

Terima kasih.

doctororange
sumber

Jawaban:

419

Anda sedang mencari Enumerable # select (juga dipanggil find_all):

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

Per dokumentasi, itu "mengembalikan array yang berisi semua elemen [enumerable, dalam kasus ini @fathers] yang bloknya tidak salah."

Jordan Running
sumber
22
Oh! Kamu yang pertama! Menghapus jawaban saya dan +1.
Milan Novota
20
Sebagai catatan, jika Anda hanya ingin menemukan satu (yang pertama) yang dapat Anda gunakan @fathers.find {|father| father["age"] > 35 }sebagai gantinya.
Leigh McCulloch
1
Apakah mungkin untuk mengembalikan indeks di mana ini ditemukan dalam array asli hash?
Ian Warner
1
@IanWarner Ya. Saya sarankan melihat dokumen untuk modul Enumerable. Jika Anda masih tidak dapat menemukannya, posting pertanyaan baru.
Jordan Running
Saya baru saja melakukan index ini = ARRAY.index {| h | h [: code] == ARRAY ["code"]}
Ian Warner
198

ini akan mengembalikan pertandingan pertama

@fathers.detect {|f| f["age"] > 35 }
Naveed
sumber
6
Saya lebih suka ini #select- Tapi semua berlaku untuk kasus penggunaan Anda. #detectakan kembali niljika tidak ada kecocokan yang ditemukan, sementara #select, dalam jawaban @ Jordan, akan kembali [].
TJ Biddle
13
Anda juga dapat menggunakan findalih-alih detectuntuk kode yang lebih mudah dibaca
Alter Lagos
8
findNamun, bisa membingungkan di rel.
user12341234
5
selectdan detecttidak sama, selectakan melintangi seluruh array, sementara detectakan berhenti segera setelah kecocokan pertama ditemukan. JIKA Anda mencari SATU pertandingan @fathers.select {|f| f["age"] > 35 }.firstvs @fathers.detect {|f| f["age"] > 35 } untuk kinerja dan keterbacaan, suara saya berlaku untukdetect
Naveed
35

jika array Anda terlihat seperti

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

Dan Anda Ingin Tahu apakah beberapa nilai sudah ada dalam array Anda. Gunakan Metode Temukan

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

Ini akan mengembalikan objek jika ada nama Hitesh jika tidak mengembalikan nihil

Hitesh Ranaut
sumber
Jika namanya huruf kecil "hitesh", tidak akan mengembalikan hash. Bagaimana kami bisa menjelaskan casing kata juga dalam kasus seperti itu?
arjun
2
Anda dapat menggunakan sesuatu seperti. array.find {| x | x [: name] .downcase == "Hitesh" .downcase}
Hitesh Ranaut