首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ruby散列的泛型重构(深度为4)

ruby散列的泛型重构(深度为4)
EN

Stack Overflow用户
提问于 2017-10-24 19:20:27
回答 1查看 120关注 0票数 3

是否可以仅根据键的位置(而不是它的值)将此散列转换为数组。I:我提前知道,第一个键永远是推动/阿尔法键,第二个键永远是一个国家(我希望将来能够随意改变)。

这个想法是将同样类型的服务器(Webserver)分组,这些服务器也在相同的环境(生产)中,但位于不同的农场(英国,美国)。

虽然任何关于如何做到这一点的建议都是受欢迎的,但是我很高兴知道我不会走进死胡同,我将无法解决.

下面是一些帮助我解释的视觉效果:

代码语言:javascript
复制
{
  "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的最低分支。

代码语言:javascript
复制
[
 [
  [PROD_UK_APP],[PROD_USA_APP]
 ],
 [
  [PROD_UK_WEB],[PROD_USA_WEB]
 ]
]

新名单..。

代码语言:javascript
复制
[
 [
  [ALPHA_USA_WEB]
 ],
 [
  [ALPHA_USA_APP],
 [
[ 

再一次,我们的想法是保持这种共性。这是几乎可以实现的,还是我可能需要某种程度的硬编码来确保它始终有效?这个想法是,如果明天英国变成日本,它仍将以完全相同的方式工作,与英国的应用程序和WEB层以及日本(从PROD中分离出来的ALPHA )进行比较。

编辑:我试图尝试对其进行排序:

代码语言:javascript
复制
  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"]]

谢谢,

EN

回答 1

Stack Overflow用户

发布于 2017-10-24 22:08:47

我想我跟着你想要的,你应该得到你想要的东西:

代码语言:javascript
复制
myhash.values.each_with_object([]) do |by_country, out_arr|
  by_country.values.each do |by_type|
    out_arr << by_type.values
  end
end

它将返回:

代码语言:javascript
复制
[
  [
    [
      "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散列,并再次获取每个散列的值
  • 将每个返回数组推入要返回的数组中。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46918425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档