How can I transform data using Enum functions?

Hi guys, I need your help.
I have data like this

[
 %Product{name: "product 1", category: "Food"},
 %Product{name: "product 2", category: "Food"},
 %Product{name: "product 3", category: "Food"},
 %Product{name: "product 4", category: "Drink"},
 %Product{name: "product 5", category: "Drink"},
 %Product{name: "product 6", category: "Drink"}
]

Can I transform this data to like this?

[
  %{
     name: "Food",  
     products: [
      %Product{name: "product 1", category: "Food"},
      %Product{name: "product 2", category: "Food"},
      %Product{name: "product 3", category: "Food"},
     ],
   },

  %{
     name: "Drink",
     products: [
      %Product{name: "product 4", category: "Drink"},
      %Product{name: "product 5", category: "Drink"},
      %Product{name: "product 6", category: "Drink"}
     ]
   }
]

I tried to use Enum.group_by and Enum.into But I can’t make it work.
It is grouped by category and if it has same category, then put that product in products list.
How can I do this?

Hi :slight_smile:

data
|> Enum.group_by(& &1.category)
|> Enum.map(fn {category, products} -> %{name: category, products: products} end)
# output
[
  %{
    name: "Drink",
    products: [
      %Product{category: "Drink", name: "product 4"},
      %Product{category: "Drink", name: "product 5"},
      %Product{category: "Drink", name: "product 6"}
    ]
  },
  %{
    name: "Food",
    products: [
      %Product{category: "Food", name: "product 1"},
      %Product{category: "Food", name: "product 2"},
      %Product{category: "Food", name: "product 3"}
    ]
  }
]

3 Likes

Thanks!
I didn’t know that I can pattern match
“Drink” => [] to fn {category, product}

Thanks alot

1 Like