2016-07-14 12 views
0

ich diese beiden Arrays basierend auf Einzigartigkeit zusammenführen möchten:Wie Arrays von Hashes in Rails basiert auf Schlüssel von Hashes verschmelzen

"template_variables": [{ 
    "info_top": "Some string" 
}, { 
    "info_bottom": "Other string" 
}], 


"user_variables": [{ 
    "info_top": "Default string" 
}, { 
    "info_bottom": "Other default string" 
}, { 
    "other_info": "Default number" 
}] 

Also, wenn ich mit dem user_variables Array und fügen template_variables es, ersetzen Hashes beginnen Wo Übereinstimmungen gefunden werden.

Meine gewünschte Ausgabe wäre:

"new_variables": [{ 
    "info_top": "Some string" 
}, { 
    "info_bottom": "Other string" 
}, { 
    "other_info": "Default number" 
}] 

I user_variables.merge(template_variables) und Variationen, die versucht haben, aber das ist nicht geeignet für eine Reihe von Hashes, wie es scheint.

Wie mache ich das?

+0

Was die gewünschte Ausgabe zu Ihrem obigen Beispiel ist? – RSB

+0

Werden die Werte im Array 'template_variables' und im Array' user_variables' immer ein Hash mit einem einzigen Schlüssel sein? Oder könntest du so etwas bekommen: '" template_variables ": [{var1: 'ein bisschen str', var2: 'str hat dasselbe wie var1'}, {var3: 'drittes str in einem anderen hash'}]' – br3nt

+1

Like @ RSB sagte, bitte fügen Sie die gewünschte Ausgabe hinzu. Bitte geben Sie uns auch an, wie Ihre Lösung (oder zumindest Ihre Übungen) aussieht. –

Antwort

2
(first_array + second_array).uniq{|hash| hash.keys.first} 

aber Ihre Datenstruktur saugt.

+0

Verstand erklären warum? Auch deine Antwort hat nicht für mich funktioniert. –

+1

Ein Array von _n_ einzelnen Element-Hashes, alle mit unterschiedlichen Schlüsseln, anstelle eines einzelnen Hashes mit _n_ Elementen. Was genau funktioniert nicht? Welches Ergebnis bekommst du? –

+0

Es wurde _hugely_ für diesen Beitrag vereinfacht, aber ja, ich verstehe Ihren Punkt, danke. Obwohl Ihr Code nur beide Hashes ohne Überschreiben zurückgibt. –

1

If:

hash = { "template_variables": 
     [{"info_top": "Some string"}, 
      {"info_bottom": "Other string"}], 

     "user_variables": 
     [{"info_top": "Default string"}, 
      {"info_bottom": "Other default string"}, 
      {"other_info": "Default number"}] 
     } 

? Dann versuchen:

values = hash.values.flatten.reverse.inject(&:merge!).map { |k,v| { k => v } } 
new_hash = {"new_variables": values} 

kehrt:

{ :new_variables => 
    [{:other_info => "Default number"}, 
    {:info_bottom => "Other string"}, 
    {:info_top => "Some string"}] 
} 
0

Sie können einfach etwas tun, wie

kk = {"aa": [{a: 1}, {b: 2}]} 
jk = {"bb": [{a:3}, {d: 4}]} 
(kk.values+jk.values).flatten.uniq{|hash| hash.keys.first} 

die zu Mladen Jablanović ähnlich schreiben

Verwandte Themen