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

标签 ruby

是否可以仅根据键的位置(而不是值)将此 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/

相关文章:

Ruby 日期参数超出范围

RubyMine: "Expression can be simplified"但是怎么办?

ruby-on-rails - Redis 大量DEL+SET 时如何处理路由超时?

Ruby 模块包含和类变量

ruby - 将 CSV 文件转换为哈希数组

ruby - 从 shell 脚本中执行 ruby​​ 文件失败

ruby-on-rails - 使用嵌套 has_many 进行 Rails 唯一性验证

ruby-on-rails - 安装 posix spawn 时出现 UTF-8 设置问题

ruby-on-rails - ActiveModel::Errors 转换错误消息的属性部分?

ruby - ruby 中的正则表达式以获取字符串中的所有元音