首页 > 解决方案 > 如何修改嵌套的哈希数组

问题描述

我有以下格式的数据:

data={"services"=>[{"name"=>"foo","checks"=>["script1","script2"]},
{"name"=>"bar","checks"=>["script3"]}]}

我正在尝试将每个检查的“检查”替换为“/bin/#{check}”。我正在玩的代码是

data["services"].map! {|svc|
  svc["checks"].map! {|check|
    check = "/bin/#{check}"
  }
}

但是这段代码替换了整个服务哈希而不是一个键,我得到:

{"services"=>[["/bin/script1", "/bin/script2"], ["/bin/script3"]]}

可以用地图吗!在...的数组哈希的深度嵌套数组中?或者我还能怎么做我需要的?

标签: ruby

解决方案


我建议避免更改data,只返回一个新的哈希:

new_data = data.each_with_object({}) do |(service, values), hash|
  hash[service] = values.map do |value|
    checks = value['checks'].map { |check| "/bin/#{check}" }
    value.merge('checks' => checks)
  end
end

=> {"services"=>[{"name"=>"foo", "checks"=>["/bin/script1", "/bin/script2"]}, {"name"=>"bar", "checks"=>["/bin/script3"]}]}

推荐阅读