如何在Ruby/Rails中合并哈希



我有一个像这样的哈希,它应该是"合并的";到其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}]}]

正如您所看到的,您可以首先根据其slug值对数组中的每个哈希进行分组,然后转换哈希所包含的值,通过其values键映射和压平每个数组,然后分组以获得它们的总数。

之后,您只需创建具有所需键/值的哈希即可。

如果你最终得到一个散列,它可能会简化一些事情,其密钥是";蛞蝓";并且包含作为其值的项目。

最新更新