2016-04-04 9 views
-1

ich ein JSON-Objekt wie dieses:Inhalte finden innerhalb JSON-Objekt in Ruby

[{ 
    "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" } 
    } 
    } 
}] 

Ich bin für ein Ergebnis aussehen wie:

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

Wie kann ich die attributes aus allen bekommen Schlüssel wie content.*?

+1

Der erste Schritt wäre, diese Struktur in etwas zu verwandeln näher zu dem, was du bist Suche nach 'map'. – tadman

+0

Willkommen bei Stack Overflow. Wenn Sie danach fragen, erwarten wir ein Beispiel für Ihre Bemühungen. Wo hast du gesucht? Warum hat es nicht geholfen? Welchen Code hast du geschrieben, um das zu lösen? Bitte lesen Sie "[ask]" und http://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/. SO ist keine "Code schreiben für mich" -Seite, es ist eine "Hilf mir den Code, den ich geschrieben habe" -Website, also zu zeigen, was du getan hast, ist wichtig. –

Antwort

0

Eine einfache Implementierung wäre, jeden Hash in eine Klasse zu übergeben, die die Verantwortung hat, sie zu extrahieren. Etwas wie:

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

Der einfache Weg ist, die Daten unter Verwendung von inject und Ruby Hash#dig 2.3 ist zu gehen:

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

Manchmal ist 'each_with_object ({})' viel klarer und Sie müssen nicht daran denken, Ihren Hash zu verketten. Schön zu sehen, dass "Hash # dig" benutzt wird! – tadman

Verwandte Themen