ruby哈希的通用重构(深度为4)

时间:2017-10-24 19:20:28

标签: ruby

是否可以仅根据键的位置(而不是键的值)将此HASH转换为数组数组。即:我提前知道第一把钥匙将永远是PROD / ALPHA,而第二把钥匙将永远是一个国家(我希望将来可以随意改变)

我们的想法是将同一类型的所有服务器(网络服务器)分组,这些服务器也在同一环境(生产)中但位于不同的农场(英国,美国)

虽然欢迎任何关于如何做到这一点的建议,我很高兴知道我不会陷入死胡同我无法解决。 < / p>

以下是一些有助于我解释的视觉效果:

{
  "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-&gt; applicationserver

[
 [
  [PROD_UK_APP],[PROD_USA_APP]
 ],
 [
  [PROD_UK_WEB],[PROD_USA_WEB]
 ]
]

新名单..

[
 [
  [ALPHA_USA_WEB]
 ],
 [
  [ALPHA_USA_APP],
 [
[ 

同样,我们的想法是保持这种通用性。这是实际上可以实现的东西还是我可能需要一定程度的硬编码来确保它始终有效?这个想法是,如果明天英国成为JAPAN,它仍将以完全相同的方式工作,比较英国的APP和WEB层,以及JAPAN(将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"]]

谢谢,

1 个答案:

答案 0 :(得分:1)

我想我会按照你要找的东西来做你应该得到的东西:

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"
    ]
  ]
]

逐片

  • 拿你的哈希值,不用键,只需创建一个值数组。
  • 遍历值(按国家/地区的哈希数组)并初始化要返回的数组。
  • 对于by_country指向的每个哈希,再次取值,放入by类型(?)哈希
  • 迭代你的by_type哈希并再次获取每个
  • 的值
  • 将每个返回数组推送到要返回的数组