是否可以仅根据键的位置(而不是值)将此 HASH 转换为数组数组。即:我提前知道第一个Key永远是PROD/ALPHA,第二个Key永远是一个国家(我希望以后可以随意改变)
我们的想法是将所有相同类型的服务器(网络服务器)分组,这些服务器也在相同的环境(生产)中但位于不同的农场(英国,美国)
虽然欢迎就如何做到这一点提出任何建议,我很高兴知道我没有走进无法解决的死胡同。
这里有一些视觉效果可以帮助我解释:
{
"PROD": {
"USA": {
"generic": [
"nginx-240"
],
"WEB": [
"nginx-210",
"nginx-241",
"nginx-211",
"nginx-209"
],
"APP": [
"tomcat-269",
"tomcat-255",
"tomcat-119",
"tomcat-124"
]
},
"UK": {
"WEB": [
"nginx-249",
"nginx-250",
"nginx-246",
"nginx-247",
"nginx-248"
],
"generic": [
"tomcat-302"
],
"APP": [
"tomcat-396",
"tomcat-156",
"tomcat-157"
]
}
},
"ALPHA": {
"USA": {
"WEB": [
"nginx-144",
"nginx-146",
"nginx-145",
"nginx-175",
"nginx-173"
],
"APP": [
"tomcat-204",
"tomcat-206"
]
}
}
}
期望哈希中最低级别的数据将组合在一起。
同样的想法是,所有生产应用程序服务器(来自英国和美国)都按照以下模式组合在一起:
PROD_UK_APP 将由 ["tomcat-396","tomcat-156","tomcat-157"] 因为这些是树 PROD->UK->applicationserver
的最低分支[
[
[PROD_UK_APP],[PROD_USA_APP]
],
[
[PROD_UK_WEB],[PROD_USA_WEB]
]
]
新列表..
[
[
[ALPHA_USA_WEB]
],
[
[ALPHA_USA_APP],
[
[
同样的想法是保持这种通用性。这是实际上可以实现的东西,还是我可能需要某种程度的硬编码以确保它始终有效?这个想法是,如果明天英国成为日本,它仍将以完全相同的方式工作,比较英国和日本的 APP 和 WEB 层(将 ALPHA 与 PROD 分开)。
编辑:我尝试对其进行排序的尝试:
def walk
a = []
myhash.each do |env, data|
data.each do |dc, tier|
tier.each do |x, y|
a << y
end
end
end
p a
end
[["nginx240"], ["nginx210", "nginx241", "nginx211", "nginx209"], ["tomcat269", "tomcat255", "tomcat119", "tomcat124"], ["nginx249", "nginx250", "nginx246", "nginx247", "nginx248"], ["tomcat302"], ["tomcat396", "tomcat156", "tomcat157"], ["nginx144", "nginx146", "nginx145", "nginx175", "nginx173"], ["tomcat204", "tomcat206"]]
谢谢,
最佳答案
我想我已经找到了你正在寻找的东西,你应该得到你想要的东西:
myhash.values.each_with_object([]) do |by_country, out_arr|
by_country.values.each do |by_type|
out_arr << by_type.values
end
end
会返回:
[
[
[
"nginx-240"
],
[
"nginx-210",
"nginx-241",
"nginx-211",
"nginx-209"
],
[
"tomcat-269",
"tomcat-255",
"tomcat-119",
"tomcat-124"
]
],
[
[
"nginx-249",
"nginx-250",
"nginx-246",
"nginx-247",
"nginx-248"
],
[
"tomcat-302"
],
[
"tomcat-396",
"tomcat-156",
"tomcat-157"
]
],
[
[
"nginx-144",
"nginx-146",
"nginx-145",
"nginx-175",
"nginx-173"
],
[
"tomcat-204",
"tomcat-206"
]
]
]
一 block 一 block
- 获取哈希,忽略键,只创建一个值数组。
- 遍历值(按国家/地区排列的哈希值数组)并初始化一个数组以返回。
- 对于 by_country 指向的每个散列,再次取值,放入按类型(?)的散列中
- 遍历您的 by_type 散列并再次获取每个散列的值
- 将每个返回数组压入你要返回的数组
关于ruby - ruby 哈希的通用重组(深度为 4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46918425/