Ruby でネストされたハッシュ要素にアクセスする
概要
このような Ruby 配列があります。
arr = [
{ "dag"=>{
"tasks"=>[
{ "arguments"=>{
"parameters"=>[
{ "name"=>"inputJson",
"value"=>"{{workflow.parameters.inputJson}}"
}
]
},
"name"=>"build-handler-workflow",
"template"=>"build-handler-workflow"
}
]
},
"name"=>"dag-build-handler-workflow"
},
{ "container"=>{
"args"=>[
"{{inputs.parameters.inputJson}}"
],
"command"=>["cowsay"],
"image"=>"docker/whalesay:latest",
"resources"=>{
"requests"=>{
"cpu"=>"100m",
"memory"=>"100Mi"
}
}
},
"inputs"=>{
"parameters"=>[
{"name"=>"inputJson"}
]
},
"metadata"=>{
"annotations"=>{
"workflows.argoproj.io/progress"=>"0/10000"
}
},
"name"=>"build-handler-workflow",
"synchronization"=>{
"semaphore"=>{
"configMapKeyRef"=>{
"key"=>"template",
"name"=>"build-handler-config"
}
}
}
}
]
画像フィールドのみを取得するには、この配列ハッシュを反復処理するにはどうすればよいでしょうか。このようなものかもしれません
p arr['spec']['templates']['container']['image']
"image"=>"docker/whalesay:latest"
ハッシュ値にアクセスするためにマップメソッドを試してみました。有効な結果を得ることができません。
p arr.map{|e|"#{e["container"]}"}
["", "{\"args\"=>[\"{{inputs.parameters.inputJson}}\"], \"command\"=>[\"cowsay\"], \"image\"=>\"docker/whalesay:latest\", \"resources\"=>{\"requests\"=>{\"cpu\"=>\"100m\", \"memory\"=>\"100Mi\"}}}"]
解決策
これを使用することもできます。また、ハッシュをナビゲートするときに dig も非常に便利です
images = []
arr.each do |item|
img = item.dig("container", "image")
images << img unless img.nil?
end
p images