zatae
Most efficient way to retrieve multiple values from nested map
Let’s say I have nested map like this :
data = %{
gps: %{
lat: 48.857144,
lon: 2.340242,
altitude: 35.0
},
metadata: %{
payload: %{
content: "1aff4c0002154a080bff4c0010774058308876aa3a29",
scantime: 1644362438
}
macaddress: "B8:C0:78:CD:12:AB",
receivetime: 1663000169,
tags: "v1.2,test.app"
}
}
# There is way more depth and values but I will keep it simple here.
What would be the best way to put lat, lon, scantime & receivetime in a new map ? The idea behind this would be to use this new simplified map with Ecto to add rows in database. I also need to ensure that every needed values is set.
Currently I am using something like this :
with {:ok, gps} <- Map.fetch(data, :gps),
{:ok, lat} <- Map.fetch(gps, :lat),
{:ok, lon} <- Map.fetch(gps, :lon),
{:ok, metadata} <- Map.fetch(data, :metadata),
{:ok, payload} <- Map.fetch(metadata, :payload),
{:ok, scantime} <- Map.fetch(payload, :scantime),
... do
%{
lat: lat,
lon: lon,
scantime: scantime,
...
}
end
I need to extract something like twelve values from even more nested map, this looks really awful. Any idea?
Trending in Questions
I’m in search of an Elixir library that offers PDF generation capabilities similar to Ruby’s Prawn. While there have been discussions abo...
New
I’m looking to build a personal workflow to quickly deploy web applications written in elixir/phoenix, for local consumption (ie not on t...
New
Using Phoenix.LiveView.TagEngine as an EEx.Engine is deprecated!
To compile HEEx, use Phoenix.LiveView.TagEngine.compile/2 instead.
Sta...
New
Hello !
We want new/edit form pages to POST/PUT to their own URL rather than the resources REST defaults (post /things, put /things/:id)...
New
Before I dive in myself, did anyone successfully sprinkle Hologram into their existing LiveView app?
Looking for hints regarding:
Addi...
New
Hi all, I wanted to ask how the community is dealing with post-release steps.
Today we have Ecto migrations, which make sure that the db...
New
I am using Oban and occasionally, shortly after a deployment, a handful of jobs can fail because of dependency on other parts of the syst...
New
Other Trending Topics
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve.
They are GUI (Emerge) and State management (S...
New
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New
I just stumbled on a newly redesigned elixir-lang.org. :tada: It looks like @Software_Mansion did the work, and I think it is generally a...
New
@hugobarauna and I (Alex Koutmos) have been hard at work on writing a book on Nerves that takes you from simply blinking LEDs to building...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #elixirconf-us
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex











First 10 of 10 Posts!
benwilson512
What should happen if a value is missing? Is that a case you need to worry about, or is the shape of the payload reliable?
Eiji
Here you go:
This code would automatically pick data you need by simply passing an
info. Also if you want to add something to result you simply can pass it as first argument which means that you can call this function multiple times for different data:Helpful resources:
tcoopman
You can also have a look at a library like GitHub - hissssst/pathex: Fastest tool to access data in Elixir · GitHub.
zatae
Works like a charm thank you ! I updated it a bit so it will raise an error instead of putting a
nilvalue.An error should be raised. If you know another way to do it, I would be very interested in seeing it too!
benwilson512
In this case, pattern match!
Pattern matching is super useful here because it provides a way to declaratively extract what you want.
zatae
I think I don’t get what you are trying to explain. This is only validating data, right ? How is this going to “flatten” the map ?
Eiji
The pattern matching is not useful only for validation, but also for assigning variables. Simplest example:
What @benwilson512 suggested is to do exactly same for nested structures, for example:
However since you said that you have many cases for this and they could be even more complicated, the pattern matching here for just a single data structure would take lots of lines. For me it looks much worse comparing to usage of a simple
infovariable in my example.zatae
I understand now ! Thank you
zatae
I have another question regarding the solution you gave. Is that possible to have a non nested value at the root of the map? Like this :
I am having a hard time finding a way to retrieve
macaddress.Eiji
Sure thing! Look that in original version I’m using
mapas a root ofinput, but in code you would find that alsolistis supported. The properinfofor thisdatawould be:However I found one thing. In original code
listpart is not best. I would rewrite it totupleinstead, for example:This way instead of
[%{nested: …}, :field1, …]we have{%{nested: …}, [:field1, …]}which separates nestedmapinfo from rootlistinfo. This way we no longer need to callEnum.groiup_by/2.