2016-07-14 5 views
0

レールにハッシュのキーに基づくハッシュの配列をマージする方法:ハッシュを交換し、私はuser_variables配列で始まるのであれば私は一意性に基づいてこれら二つの配列をマージしたい

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

をし、それにtemplate_variablesを追加マッチが見つかる場所。

私の所望の出力は次のようになります。

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

私はその上user_variables.merge(template_variables)とバリエーションを試してみたが、それはハッシュの配列に適していないですが、それはそうです。

どうすればよいですか?

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

に似て

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

ような何かを行うことができますか? – RSB

+0

'template_variables'配列と' user_variables'配列の値は、常に単一のキーを持つハッシュになりますか? '' template_variables ':{{var1:' some str '、var2:' str in var1 '}、{var3:' 3番目のstrが別のハッシュ '}]' – br3nt

+1

のようになります。 @RSBは、希望の出力を追加してください。また、あなたの解決策(または少なくともあなたの練習問題)がどのようなものかを教えてください。 –

答えて

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

が、あなたのデータ構造は吸う:

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

リターン:

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

はその後、これを試してみてください。

+0

理由を説明するマインド?また、私の答えはうまくいかなかった。 –

+1

_n_要素を持つ単一のハッシュではなく、すべてが異なるキーを持つ_n_単一要素ハッシュの配列です。また、正確には動作しないものはありますか?あなたはどんな結果を得ますか? –

+0

この投稿には非常に簡素化されていますが、ええ、私はあなたのことを知っています。あなたのコードは、上書きすることなく両方のハッシュを返すだけですが。 –

1

た場合。

0

あなたは、単にあなたの上記の例に所望の出力は何ムラデンJablanovićポスト

関連する問題