繁体   English   中英

如何在 Ruby/Rails 中合并哈希

[英]how to merge Hashes in Ruby/Rails

我有一个像这样的 Hash ,它应该“合并”到它的 uniq 嵌套值

[
  {
    "slug": "color",
    "values": [{ "slug": "amethyst" },
               { "slug": "coral" }],
  },
  {
    "slug": "color",
    "values": [{ "slug": "amethyst" }],
  },
  {
    "slug": "power-source",
    "values": [{ "slug": "110V"}],
  }
]

同时它应该计算重复值,但在items数组中设置为 uniq:

 {  "slug": "color",
    "items": [
             {
              "slug": "amethyst",
              "count": 2
             },
             {
              "slug": "coral",
              "count": 1
             }]
 },
{
   "slug": "power-source",
   "items": [
             {
              "slug": "110V",
              "count": 1
             }]
 }
]

is there a "Rails method" to achieve this?

Thank you

我认为 Rails 中没有任何内置功能可以让您获得这样的自定义要求,但是您可以通过使用不同的方法及其返回值来实现它:

data
  .group_by { |hash| hash[:slug] }
  .transform_values do |values|
    values
      .flat_map { |vals| vals[:values] }
      .group_by { |value| value[:slug] }
      .transform_values(&:count)
  end.map do |slug, items|
    [slug, items.map { |item, count| {slug: item, count: count} }]
  end.map { |slug, items| {slug: slug, items: items} }
  # [{:slug=>"color",
  #   :items=>[{:slug=>"amethyst", :count=>2}, {:slug=>"coral", :count=>1}]},
  #  {:slug=>"power-source", :items=>[{:slug=>"110V", :count=>1}]}]

如您所见,您可以首先将数组中的每个 hash 按它们的slug值分组,然后转换 hash 包含的值,通过它们的values键映射和展平每个数组,然后分组以获得它们的总数。

之后,您可以使用所需的键/值创建 hash。

如果你最终得到一个 hash,它的键是“slugs”并且包含项目作为它的值,它可能会简化一些事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM