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.

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."


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 }

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.