2017-02-23 15 views
0

私は、次のハッシュがあります変更キーRubyのハッシュで体位

my_hash = { 
    "redis_1"=>{"group"=>"Output", "name"=>"Redis", "parameters"=>{"redis_db"=>2, "redis_password"=>"<password>"}}, 
    "file_1"=>{"name"=>"File", "group"=>"Output", "parameters"=>{"file"=>"/opt/var/lib/bots/file-output/ctt.txt", "hierarchical_output"=>false}} 
} 

をそして、私は最初の位置にそれぞれ内側のハッシュでキーparametersを移動したいと思い、このような何か:

my_hash = { 
    "redis_1"=>{"parameters"=>{"redis_db"=>2, "redis_password"=>"<password>"}, "group"=>"Output", "name"=>"Redis"}, 
    "file_1"=>{"parameters"=>{"file"=>"/opt/var/lib/bots/file-output/ctt.txt", "hierarchical_output"=>false}, "name"=>"File", "group"=>"Output"} 
} 

私は次のコードを持っている:

my_hash.each_pair do |key, value| 
    value.sort_by {|k, v| k == "parameters" ? 0 : 1} 
end 

私はすべてのエラーを得ていないんだけど、このコードはanytをしないとヒンジと私は非常に私が望む出力に到達する方法を失っています。

+1

興味があるだけ:ここ

はまだあなたの提案した方法に非常に似て作業コードは、です!なぜこれをする必要がありましたか?あなたは説明することができます:) –

+0

私はいくつかのYAMLファイルを持っており、私がそれらを読んだとき、私が得る出力は質問でここに示す最初のハッシュです。そして私はこれらのYAMLを使ってプログラムを構成しています。そのプログラムはハッシュの最初のキーとしてパラメータを必要とします。 YAMLファイルを変更することはできませんので、私はこれを行う必要がありました:) @PreethiKumar – mf370

答えて

1
my_hash 
.each {|k, v| my_hash[k] = {"parameters" => v.delete("parameters")}.merge(v)} 

または

my_hash 
.each_value{|v| v.replace({"parameters" => v.delete("parameters")}.merge(v))} 

戻り値:

{ 
    "redis_1"=>{"parameters"=>{"redis_db"=>2, "redis_password"=>"<password>"}, "group"=>"Output", "name"=>"Redis"}, 
    "file_1"=>{"parameters"=>{"file"=>"/opt/var/lib/bots/file-output/ctt.txt", "hierarchical_output"=>false}, "name"=>"File", "group"=>"Output"} 
} 
1

のは、あなたのコードをデバッグしてみましょう:

my_hash.each_pair do |key, value| 
    p value.sort_by {|k, v| k == "parameters" ? 0 : 1} 
end 

それは出力:

[["parameters", {"redis_db"=>2, "redis_password"=>"<password>"}], ["group", "Output"], ["name", "Redis"]] 
[["parameters", {"file"=>"/opt/var/lib/bots/file-output/ctt.txt", "hierarchical_output"=>false}], ["name", "File"], ["group", "Output"]] 

それは正しくペアをソートしますが、:

  • 、それが最初の問題のために、元のハッシュ

に結果を書き込みません配列の代わりに、ハッシュ

  • を返し、 to_hを使用できます。

    2番目の場合は、transform_values!をRuby 2.4で使用できます。

    my_hash.transform_values! do |subhash| 
        subhash.sort_by { |k, _| k == 'parameters' ? 0 : 1 }.to_h 
    end 
    
  • 関連する問題