2017-12-05 8 views
0

이 같은 비정규 값을 각각 갖는 해시의 배열을 갖는다. 내가 아는 사람, 즉 arr.person.knowntrue 인 해시 하위 배열을 가져 오려고합니다. 내가 시도검색 어레이

subarr = [{ 
    id: 0, 
    type: 'character', 
    person: { 
     name: 'Steve Rogers', 
     weapon: 'Shield', 
     known: true 
    } 
    }] 

: 같은 결과는해야

b = arr.select{|x| x.person.known} 
b = arr.reject{|x| if x.person then x.person.known} 

하지만 NoMethodError: undefined method `person' for Hash:0x007fc5f6f587f0 부딪.

+0

주 그'[ '사람'] '와, 언'arr.person' 자바 스크립트에서 같은 일이다, 그러나 루비한다. 해시는 객체와 다릅니다. Ruby 해시를 그렇게 작동 시키려면 할 수있는 일이 있지만 미묘한 버그가 아닌 미묘한 버그가 발생할 수 있으므로 권장하지 않습니다. – Amadan

+0

@Amadan 이해합니다. 나는 실제로 레일에 연결된 레코드로 작업하고 있습니다. 각각의 항목 has_one person과 belongs_to : entries, inverse_of : : entry, optional : true – RedOster

+0

"해시 배열"이라고 말하면서 "해시"라고 태그를 붙였습니다. {x | x & .person & .known}'이 가장 선명합니다. – Amadan

답변

6

이 하나

arr.select { |item| item.fetch(:person, {})[:known] } 

또는

arr.select { |item| (item[:person] || {})[:known] } 

을 시도하거나, 루비 2.3.0에서

arr.select { |item| item.dig(:person, :known) } 

더 자세한하지만 어쩌면 명확

arr.select do |item| 
    person = item.fetch(:person, {}) 
    person[:known] 
end 

또는

arr.select { |item| item[:person] && item[:person][:known] } 
+1

아니면'arr.select {| x | x [: person] &. [] (: known)}'(하지만'dig'는 정말 좋습니다.) – Amadan

+0

또는 그. 하지만 충분한 옵션이 있다고 생각합니다. D – Ursus