루비의 해시 값으로 해시 배열을 어떻게 검색합니까?


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블록 의 모든 요소를 ​​포함하는 배열이 거짓이 아닌" 배열을 반환합니다 . "


22
오! 당신은 첫 번째 사람이었습니다! 내 답변을 삭제하고 +1
밀라노 노보 타

20
참고로, 하나 (첫 번째) 만 찾으려면 @fathers.find {|father| father["age"] > 35 }대신 사용할 수 있습니다 .
레이 McCulloch

1
원래 해시 배열에서 이것이 발견 된 곳의 색인을 반환 할 수 있습니까?
Ian Warner

1
@IanWarner 예. Enumerable 모듈에 대한 문서를 살펴 보는 것이 좋습니다. 여전히 파악할 수 없으면 새 질문을 게시하십시오.
Jordan 달리기

방금이 인덱스 = ARRAY.index {| h | h [: code] == ARRAY [ "code"]}
Ian Warner

198

이것은 첫 번째 경기를 반환합니다

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

6
나는 이것을 선호한다 #select-그러나 모두는 당신의 유스 케이스에 간다. #detect반환 nil하면서 일치하는 항목이 발견되지 않는 경우 #select요르단의 대답 @으로 반환합니다 [].
TJ Biddle

13
보다 읽기 쉬운 코드 find대신 사용할 수도 있습니다detect
Alter Lagos

8
find그러나 난간에 혼란을 줄 수 있습니다.
user12341234

5
selectdetect, 동일하지 않은 select반면, 전체 배열을 횡단한다 detect즉시 첫 번째 일치가 발견으로 중지됩니다. 당신이 하나의 일치를 찾는 경우에 @fathers.select {|f| f["age"] > 35 }.first@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"} 
]

그리고 배열에 어떤 값이 이미 있는지 알고 싶습니다. 찾기 방법 사용

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.