experimentix
Update map in loop
Hello
I’m new to elixir and i’m struggling with this problem
I’ve a map lets call it order and that has several products
I want to loop through this products map inside the order map and append some info from another map called associated products
it looks like this
orders map
%{
"_csrf_token" => "gwsgw",
"custom_tags" => "",
"id" => "62212",
"products" => %{
"123456" => %{
"category" => "3",
"tag" => ["hero", "superstar"],
"title" => "Product title"
},
"234567" => %{"category" => "5", "title" => "Product title"},
"345678" => %{
"category" => "8",
"tag" => ["creation", "dynasty"],
"title" => "Product title"
},
"456789" => %{
"category" => "5",
"title" => "Product title"
},
},
"order_id" => "193885",
"custom_message" => "Nothing to declare",
"tags_title" => %{"tag" => ["preview"]},
"allcats" => "5"
}
associated products map
%{
"123456" => [
%{
"id" => "4984944",
"has_stock" => false,
"name" => "Other product Name",
"product_id" => "123456",
},
%{
"id" => "3511064",
"has_stock" => true,
"name" => "Other product Name",
"product_id" => "123456",
}
],
"234567" => [
%{
"id" => "3511075",
"has_stock" => true,
"name" => "Other product Name",
"product_id" => "234567",
},
%{
"id" => "3511076",
"has_stock" => false,
"name" => "Other product Name",
"product_id" => "234567",
}
],
"345678" => [
%{
"id" => "3511082",
"has_stock" => true,
"name" => "Other product Name",
"product_id" => "345678",
},
%{
"id" => "3511083",
"has_stock" => false,
"name" => "Other product Name",
"product_id" => "345678",
}
]
}
i tried this code to put the associated products but it only gets updated with the last item, i assume its because it doesn’t update the order in every loop
order = for {pid, v} <- order["products"] do
IO.inspect pid
IO.inspect v
order = put_in(order, ["products", pid,"associated_products"], associated_products[pid])
end
How can i achieve this result??
%{
"_csrf_token" => "gwsgw",
"custom_tags" => "",
"id" => "62212",
"products" => %{
"123456" => %{
"category" => "3",
"tag" => ["hero", "superstar"],
"title" => "Product title",
"associated_products" => [
%{
"id" => "4984944",
"has_stock" => false,
"name" => "Other product Name",
"product_id" => "123456",
},
%{
"id" => "3511064",
"has_stock" => true,
"name" => "Other product Name",
"product_id" => "123456",
}
]
},
"234567" => %{"category" => "5",
"title" => "Product title",
"associated_products" => [
%{
"id" => "4984944",
"has_stock" => false,
"name" => "Other product Name",
"product_id" => "234567",
},
%{
"id" => "3511064",
"has_stock" => true,
"name" => "Other product Name",
"product_id" => "234567",
}
]
},
"345678" => %{
"category" => "8",
"tag" => ["creation", "dynasty"],
"title" => "Product title",
"associated_products" => [
%{
"id" => "4984944",
"has_stock" => false,
"name" => "Other product Name",
"product_id" => "345678",
},
%{
"id" => "3511064",
"has_stock" => true,
"name" => "Other product Name",
"product_id" => "345678",
}
]
},
"456789" => %{
"category" => "5",
"title" => "Product title",
"associated_products" => [
%{
"id" => "4984944",
"has_stock" => false,
"name" => "Other product Name",
"product_id" => "456789",
},
%{
"id" => "3511064",
"has_stock" => true,
"name" => "Other product Name",
"product_id" => "456789",
}
]
},
},
"order_id" => "193885",
"custom_message" => "Nothing to declare",
"tags_title" => %{"tag" => ["preview"]},
"allcats" => "5"
}
Marked As Solved
stefanluptak
Check this gist: update_map_in_loop.md · GitHub
It’s a Livebook, so you can copy and paste it into your Livebook server and play with it.
If you need more explanation, I can provide it. I am pretty sure there are more elegant ways to achieve this, but this should be good enough as a start.
The problem with your solution is that it’s not “reducing” the order (keeping the changes for all iterations), just returning the list of modified orders. Each order (item of the returned list) is the order modified but just for a single product.
Hope this helps a bit.
Also Liked
experimentix
Thank you very much, it worked. And thanks for small explanation.
I think i understand how things work now looking at your code.
Once again thanks
experimentix
Since my associated products has the key same as the product key i ended with removing some of your code and referencing it like this
Enum.reduce(order["products"], order, fn {product_id, _product}, order ->
update_in(order, ["products", product_id], fn product ->
Map.put(product, "associated_products", associated_products[product_id])
end)
end)
Once again thanks








