在Ruby Hash中更改关键位置

时间:2017-02-23 11:42:24

标签: ruby hash

我有以下哈希:

public IActionResult Spa()
{
    return File("~/index.html", "text/html");
}

我想将每个内部哈希中的键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"}
}

我没有收到任何错误,但是这段代码没有做任何事情,而且我对如何达到我想要的输出感到很遗憾。

2 个答案:

答案 0 :(得分: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 :(得分: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

对于第二个,您可以使用Ruby 2.4中提供的transform_values!

这是工作代码,它与您提出的方法非常相似:

my_hash.transform_values! do |subhash|
  subhash.sort_by { |k, _| k == 'parameters' ? 0 : 1 }.to_h
end