2017-12-05 13 views
0

私はこのような非正規化値それぞれ有するハッシュの配列を有する:検索アレイ

arr = [{ 
    id: 0, 
    type: 'character', 
    person: { 
     name: 'Steve Rogers', 
     weapon: 'Shield', 
     known: true 
    } 
    }, 
    { 
    id: 1, 
    type: 'organization', 
    company: "Pym Industries", 
    tech: 'Shrinking suit' 
    }, 
    { 
    id: 2, 
    type: 'character', 
    person: { 
     name: 'Tony Stark', 
     weapon: 'Ironman Suit', 
     known: false 
    } 
    }] 

ハッシュの一部が異なっているが。私は人が知っている、つまり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'はJavaScriptではなく、Rubyで同じものです。ハッシュはオブジェクトと同じではありません。 Rubyハッシュをそのように振る舞わせるためにできることはありますが、微妙なバグでも微妙でもないバグの原因となる可能性があるため、推奨されていません。 – Amadan

+0

@Amadanそれを理解する。私は実際にレールの関連レコードで作業しています。各エントリhas_one personとbelongs_to:エントリー、inverse_of::エントリー、オプション:true – RedOster

+0

"ハッシュの配列"と言って、それを "ハッシュ"とタグ付けしました。選択{| x | x&.person&.known} 'が最も明瞭です。 – Amadan

答えて

6

この1

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

または

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

を試すか、Rubyの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

関連する問題