experimentix

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

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

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

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

Where Next?

Popular in Questions Top

lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
LegitStack
I’m hoping you guys can give me some general advice and perhaps code examples if you’re feeling up to it. I’m very interested in Elixir,...
New
jerry
Good day to you all. I have been struggling to get a query involving like and ilike to work. Can anyone assist me on this, please? pro...
New
itssasanka
Hi all, Trying to get some more clarity over utc_datetime and naive_datetime for Ecto: https://hexdocs.pm/ecto/Ecto.Schema.html#module-...
New
quazar
How to set Jason to encode all fields in ecto schema, I don’t care about security and implementing only is taking long list of attributes...
New
mgjohns61585
Could someone help me? I'm making my first elixir program, number guessing game. I can't figure out how to convert the user's guess from ...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? https://hexdocs.pm/ecto/Ecto.Repo.h...
New
chewm
Hi guys, nice to meet you to the whole forum, I’m new here, I’m trying to configure visual studio code for elixir, right now the intellis...
New

Other popular topics Top

TunkShif
This post is an instruction guide to help you setup your Neovim for Elixir development from scratch. It includes general information on h...
273 38985 115
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
977 41022 311
New
William
I would like to know that is there any online source for learning Phoenix Framework for building E-Commerce Store? Any advantage on build...
New
lessless
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
AstonJ
You’re a programmer, so you don’t need spoon feeding with the conventional drivel about “this is an integer.” No. You need to know what’s...
New
ycv005
I have followed this StackOverflow post to install the specific version of Erlang. And When I am running mix ecto.setup then getting fol...
New
polypush135
As many of you may have realized by now (sorry for all the posts here) I’ve been working on a db problem where I’m trying to aggregate a ...
New
vac
Hi, I'm quite new in Elixir and I'm trying to format a string to a PEM format. I have the certificate value like MIIDBTCCAe2...... and ...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New

We're in Beta

About us Mission Statement