Bir karma dizisi içinde ruby ​​karma değerlerine göre nasıl arama yaparım?


234

Benim bir dizi karma, @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 

Bu diziyi nasıl arayabilirim ve bir bloğun doğru döndürdüğü karma dizisini nasıl döndürebilirim?

Örneğin:

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

Teşekkürler.

Yanıtlar:


419

Enumerable # select (ayrıca denir find_all) arıyorsunuz :

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

Belgelere göre, " @fathersbloğun yanlış olmadığı [numaralandırılabilir, bu durumda ] öğesinin tüm öğelerini içeren bir dizi döndürür ."


22
Ah! Sen ilktin! Cevabımı silme ve +1.
Milan Novota

20
Not olarak, yalnızca tek bir tane (ilkini) bulmak istiyorsanız @fathers.find {|father| father["age"] > 35 }bunun yerine kullanabilirsiniz .
Leigh McCulloch

1
Bunun orijinal karma dizisinde bulunduğu yerin dizinini döndürmek mümkün müdür?
Ian Warner

1
@IanWarner Evet. Numaralandırılabilir modül için belgelere bakmanızı öneririm. Hala anlayamıyorsanız, yeni bir soru gönderin.
Ürdün

Ben sadece bu indeksi yaptım = ARRAY.index {| h | h [: kod] == ARRAY ["kod"]}
Ian Warner

198

bu ilk maçı döndürecek

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

6
Bunu tercih ederim #select- Ama hepsi sizin kullanım durumunuz için geçerlidir. herhangi bir eşleşme bulunmazsa #detectgeri döner , @ Jordan'ın cevabında geri döner . nil#select[]
TJ Biddle

13
Daha okunabilir bir kod findyerine de kullanabilirsinizdetect
Alter Lagos

8
findAncak raylarda kafa karıştırıcı olabilir.
user12341234

5
selectve detectaynı değil select, tüm diziyi çaprazlar detect, ilk eşleşme bulunur bulunmaz durur. ONE maçı aradığınız IF @fathers.select {|f| f["age"] > 35 }.firstvs @fathers.detect {|f| f["age"] > 35 } performans ve okunabilirlik için, oyumu için de geçerlidetect
Naveed

35

diziniz benziyorsa

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

Ve dizinizde zaten bir değerin mevcut olup olmadığını bilmek istersiniz. Bulma Yöntemini Kullan

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

Hitesh adında varsa bu nesne döndürür, aksi takdirde nil döndürür


Ad küçük harfli "hitesh"olsaydı, karma döndürmez. Bu gibi durumlarda kelime muhafazasını nasıl açıklayabiliriz?
arjun

2
gibi bir şey kullanabilirsiniz. array.find {| x | x [: name] .downcase == "Hitesh" .downcase}
Hitesh Ranaut
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.