Làm cách nào để tìm kiếm trong một mảng băm bằng các giá trị băm trong ruby?


234

Tôi có một mảng băm, @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 

Làm thế nào tôi có thể tìm kiếm mảng này và trả về một mảng băm mà một khối trả về đúng?

Ví dụ:

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

Cảm ơn.

Câu trả lời:


419

Bạn đang tìm kiếm En Countable # select (còn được gọi find_all):

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

Theo tài liệu, nó "trả về một mảng chứa tất cả các phần tử của [liệt kê, trong trường hợp này @fathers] cho khối nào không sai."


22
Oh! Bạn là người đầu tiên! Xóa câu trả lời của tôi và +1.
Milan Novota

20
Lưu ý, nếu bạn chỉ muốn tìm một cái duy nhất (cái đầu tiên), bạn có thể sử dụng @fathers.find {|father| father["age"] > 35 }thay thế.
Leigh McCulloch

1
Có thể trả về chỉ mục của nơi này được tìm thấy trong mảng băm ban đầu không?
Ian Warner

1
@IanWarner Vâng. Tôi đề nghị xem xét các tài liệu cho mô-đun En đếm. Nếu bạn vẫn không thể tìm ra nó, hãy đăng một câu hỏi mới.
Jordan chạy

Tôi vừa mới làm chỉ số này = ARRAY.index {| h | h [: code] == ARRAY ["code"]}
Ian Warner

198

điều này sẽ trở lại trận đấu đầu tiên

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

6
Tôi thích điều này hơn #select- Nhưng tất cả đều phù hợp với trường hợp sử dụng của bạn. #detectsẽ trở lại nilnếu không tìm thấy kết quả phù hợp, trong khi #select, trong câu trả lời của @ Jordan, sẽ trở lại [].
TJ Biddle

13
Bạn cũng có thể sử dụng findthay vì detectmã dễ đọc hơn
Alter Lagos

8
findcó thể gây nhầm lẫn trong đường ray, tuy nhiên.
dùng12341234

5
selectdetectkhông giống nhau, selectsẽ ngang qua toàn bộ mảng, trong khi detectsẽ dừng ngay khi trận đấu đầu tiên được tìm thấy. NẾU bạn đang tìm kiếm ONE trận đấu @fathers.select {|f| f["age"] > 35 }.firstvs @fathers.detect {|f| f["age"] > 35 } cho hiệu suất và khả năng đọc, phiếu bầu của tôi đi chodetect
Naveed

35

nếu mảng của bạn trông như

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

Và bạn muốn biết nếu một số giá trị đã có trong mảng của bạn. Sử dụng phương pháp tìm

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

Điều này sẽ trả về đối tượng nếu Hitesh có mặt trong tên nếu không trả về nil


Nếu tên là chữ thường "hitesh", nó sẽ không trả về hàm băm. Làm thế nào chúng ta có thể giải thích cho vỏ từ cũng trong các trường hợp như vậy?
arjun

2
bạn có thể sử dụng một cái gì đó như. mảng.find {| x | x [: name] .downcase == "Hitesh" .downcase}
Hitesh Ranaut
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.