2016-05-25 14 views
2

Ich muss eine Methode festlegen, die zwei verschachtelte Datenstrukturen zu einer kombiniert.Wie werden zwei verschachtelte Datenstrukturen zu einer kombiniert?

hier ist der erste Hash:

[ 
    { 
    "blake" => { 
     :awesomeness => 10, 
     :height => "74", 
     :last_name => "johnson" 
    }, 
     "ashley" => { 
     :awesomeness => 9, 
     :height => 60, 
     :last_name => "dubs" 
    } 
    } 
] 

hier ist der zweite Hash:

[ 
    { 
    :first_name => "blake" 
    }, 
    { 
    :first_name => "ashley" 
    } 
] 

das Ergebnis wird so aussehen:

[ 
    { 
     :first_name => "blake", 
     :awesomeness => 10, 
     :height => "74", 
     :last_name => "johnson" 
    }, 
    { 
     :first_name => "ashley", 
     :awesomeness => 9, 
     :height => 60, 
     :last_name => "dubs" 
    } 
] 

Antwort

3

Bitte beachten, dass, was Sie nennen Hashes sind in der Tat Arrays, und auch das ist nicht konsistent. Das erste ist ein Array, das einzelnen Hash enthält, und das zweite ist ein Array, das zwei Hashes enthält.

Für die gegebenen zwei Arrays, wenn wir die erste v1 und zweite v2 nennen, dann, unter Code den Ausgang geben sollten Sie sich wünschen:

v1[0].values.map.with_index {|v, i| v2[i].merge(v)} 

Erläuterung:

Hash#merge führt zwei Hashes zusammen, so dass es verwendet werden muss, um das Ergebnis zu erzielen.

Der erste Hash aus v1 sein wird - wir das erste Element des v1 Array auszuwählen, die ein Hash ist, und nehmen alle ihre values die Hashes selbst sind - so, haben wir eine Reihe von Hash in v1[0].values.

Die zweite Reihe von Hashes ist v2.

Jetzt verwenden wir die Enumerable#map-Methode, um über das erste Array von Hashes zu iterieren und das Ergebnis der Zusammenführung jedes seiner Elemente mit dem entsprechenden Element aus v2 zu sammeln.

+0

danke! Kannst du erklären, wie es funktioniert? –

+1

@StevenKwok Haben die Antwort aktualisiert. –

1

Ich nehme an, Sie wollten den folgenden Hash definieren (anstatt ein Array mit einem Element, einem Hash).

h = { "blake" => { :awesomeness => 10, 
        :height => "74", 
        :last_name => "johnson" 
        }, 
     "ashley" => { :awesomeness => 9, 
        :height => 60, 
        :last_name => "dubs" 
        } 
    } 

Es gibt viele Möglichkeiten, um die Schlüssel-Wert-Paare :first_name=>"blake" und :first_ame=>"ashley" mit ihrem zugehörigen Hashes hinzuzufügen. Hier ist eine:

So stellt sich die Frage: Was ist die Funktion des folgenden Arrays?

a = [{ :first_name => "blake" }, { :first_name => "ashley" }]  

Wenn dieses Array verwendet wird, um festzulegen, welche Tasten von f beibehalten werden, wir

retain = a.map { |g| g[:name] } 
    #=> ["blake", "ashley"] 
f.select { |k| retain.include?(k) } 
    #=> {"blake"=>{:first_name=>"blake", :awesomeness=>10, :height=>"74", 
    #    :last_name=>"johnson"}, 
    # "ashley"=>{:first_name=>"ashley", :awesomeness=>9, :height=>60, 
    #    :last_name=>"dubs"}} 

Auf der anderen Seite schreiben könnte, wenn

a = [{:name=>"blake"}] 

dann

retain = a.map { |g| g[:name] } 
    #=> ["blake"] 
f.select { |k| retain.include?(k) } 
    #=> {"blake"=>{:first_name=>"blake", :awesomeness=>10, :height=>"74", 
    #    :last_name=>"johnson"}} 
Verwandte Themen