2016-04-04 9 views
-1

でJSONオブジェクト内のコンテンツを検索し、私はこのようなJSONオブジェクトを持っている:ルビー

[{ 
    "content.app" => { 
    "type" => "content", "depends_on" => [], 
    "primary" => { 
     "id" => 1, 
     "attributes" => { 
     "data" => "my data" 
     }, 
     "meta" => { "schema_version" => "1" } 
    } 
    } 
}, { 
    "content.mongodb" => { 
    "type" => "content", "depends_on" => [], 
    "primary" => { 
     "id" => 2, 
     "attributes" => { 
     "data" => "my data from app" 
     }, "meta" => { "schema_version" => "1" } 
    } 
    } 
}, { 
    "stuff.other" => { 
    "type" => "content", "depends_on" => [], 
    "primary" => { 
     "id" => 2, "attributes" => { 
     "data" => "my data from mongodb" 
     }, "meta" => { "schema_version" => "1" } 
    } 
    } 
}] 

私は次のように結果を探しています:私はすべてのattributesを取得できますか

"content.app" => "my data from app", 
"content.mongodb" => "my data from mongodb" 

content.*のようなキー?

+1

最初のステップは、あなたがしているものに近いものに、この構造を変革することです'map'を使って探しています。 – tadman

+0

ようこそスタックオーバーフロー。尋ねるとき、私たちはあなたの努力の一例を見ることを期待しています。どこを探しましたか?なぜそれは助けになりませんでしたか?これを解決するためにどのようなコードを書いていますか? 「[ask]」とhttp://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/をお読みください。 SOは「私のためのコードを書いてください」というサイトではなく、「自分が書いたコードを修正するのに役立つ」サイトなので、行ったことを示すことが重要です。 –

答えて

0

簡単な実装では、各ハッシュを抽出する責任があるクラスに渡すことがあります。ような何か:

class AttributesExtractor 
    def initialize(hash) 
    @hash = hash 
    @primary_key = hash.keys.first.to_s 
    end 

    def extract 
    return unless primary_key_pattern? 

    attr_data = hash[primary_key].dig('primary', 'attributes', 'data') 

    if attr_data 
     {hash.keys.first => attr_data} 
    end 
    end 

    private 

    attr_reader :hash, :primary_key 

    def primary_key_pattern? 
    primary_key.split('.').first.to_s == 'content' 
    end 
end 

the_array_of_hash.map { |hash| AttributesExtractor.new(hash).extract }.compact 
=> [{"content.app"=>"my data"}, {"content.mongodb"=>"my data from app"}] 
2

簡単な方法はinjectを使用してデータを歩いているとRuby 2.3のHash#dig

data = ... # that array of hashes 
data.inject({}){|h,v| 
    v.inject(h){|h,(k,v)| h[k] = v.dig("primary", "attributes", "data"); h } 
h} 
# => {"content.app"=>"my data", "content.mongodb"=>"my data from app", "stuff.other"=>"my data from mongodb"} 
+0

'each_with_object({})'ははるかにはっきりしているので、ハッシュを連鎖させることを覚えておく必要はありません。ハッシュ#digが使用されているのを見てうれしい! – tadman