Maxximiliann

Maxximiliann

Filtering a map against a list of values

trades = 
%{
  "3QvxP6YFBKpWJSMAfYtL8Niv8KmmKsnpb9uQwQpg8QN2" => [
    %{
      asset: "3QvxP6YFBKpWJSMAfYtL8Niv8KmmKsnpb9uQwQpg8QN2",
      last_price: 0.09019287,
      priced_in: "WAVES",
      volume: 13918.3182330112
    },
    %{
      asset: "3QvxP6YFBKpWJSMAfYtL8Niv8KmmKsnpb9uQwQpg8QN2",
      last_price: 0.1313214,
      priced_in: "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p",
      volume: 9986.99466236054
    },
    %{
      asset: "3QvxP6YFBKpWJSMAfYtL8Niv8KmmKsnpb9uQwQpg8QN2",
      last_price: 1.268e-5,
      priced_in: "8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS",
      volume: 9786.93694331709
    }
  ],
  "474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu" => [
    %{
      asset: "474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu",
      last_price: 192.01,
      priced_in: "WAVES",
      volume: 137852.319057268
    },
    %{
      asset: "474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu",
      last_price: 279.152165,
      priced_in: "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p",
      volume: 77018.2552159809
    },
    %{
      asset: "474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu",
      last_price: 0.02768054,
      priced_in: "8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS",
      volume: 38723.9182969945
    },
    %{
      asset: "474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu",
      last_price: 459.22,
      priced_in: "Ft8X1v1LTa1ABafufpaCWyVj8KkaxUWE6xBhW6sNFJck",
      volume: 513.413421879477
    }
  ],
  "4LHHvYGNKJUg5hj65aGD5vgScvCBmLpdRFtjokvCjSL8" => [
    %{
      asset: "4LHHvYGNKJUg5hj65aGD5vgScvCBmLpdRFtjokvCjSL8",
      last_price: 0.05171444,
      priced_in: "WAVES",
      volume: 14110.9296573005
    },
    %{
      asset: "4LHHvYGNKJUg5hj65aGD5vgScvCBmLpdRFtjokvCjSL8",
      last_price: 7.5e-6,
      priced_in: "8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS",
      volume: 9722.17123718049
    },
    %{
      asset: "4LHHvYGNKJUg5hj65aGD5vgScvCBmLpdRFtjokvCjSL8",
      last_price: 0.075459,
      priced_in: "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p",
      volume: 8482.23199810624
    }
  ]
}
defmodule Remove_Blacklisted_Assets do		

	def filter_excluded_assets(number_of_assets_to_be_excluded, accumulator) when accumulator == number_of_assets_to_be_excluded do

		excluded = ['DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p', '8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', '2tR9EKvDPMThfrFSb96CSBGYNwNPtzwkGcdhQjv4dVoj']
		number_of_assets_to_be_excluded = length(excluded)			
				
		Enum.filter(trades, fn map -> map.priced_in != Enum.fetch!(excluded, 0) end)
			|> Enum.into(%{})
			|> IO.inspect
	end



	def filter_excluded_assets(number_of_assets_to_be_excluded, accumulator) do

		excluded = ['DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p', '8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', '2tR9EKvDPMThfrFSb96CSBGYNwNPtzwkGcdhQjv4dVoj']
		number_of_assets_to_be_excluded = length(excluded)

		Enum.filter(trades, fn map -> map.priced_in != Enum.fetch!(excluded,(number_of_assets_to_be_excluded - accumulator)) end)
			|> IO.inspect
			
		filter_excluded_assets(number_of_assets_to_be_excluded, accumulator + 1)
	end
	
			
end

Desired output:

trades = 
%{
  "3QvxP6YFBKpWJSMAfYtL8Niv8KmmKsnpb9uQwQpg8QN2" => [
    %{
      asset: "3QvxP6YFBKpWJSMAfYtL8Niv8KmmKsnpb9uQwQpg8QN2",
      last_price: 0.09019287,
      priced_in: "WAVES",
      volume: 13918.3182330112
    }
  ],
  "474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu" => [
    %{
      asset: "474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu",
      last_price: 192.01,
      priced_in: "WAVES",
      volume: 137852.319057268
    },
    %{
      asset: "474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu",
      last_price: 459.22,
      priced_in: "Ft8X1v1LTa1ABafufpaCWyVj8KkaxUWE6xBhW6sNFJck",
      volume: 513.413421879477
    }
  ],
  "4LHHvYGNKJUg5hj65aGD5vgScvCBmLpdRFtjokvCjSL8" => [
    %{
      asset: "4LHHvYGNKJUg5hj65aGD5vgScvCBmLpdRFtjokvCjSL8",
      last_price: 0.05171444,
      priced_in: "WAVES",
      volume: 14110.9296573005
    }
    }
  ]
}
iex(1)> Remove_Blacklisted_Assets.filter_excluded_assets(3,0)
** (ArgumentError) you attempted to apply :priced_in on {"3QvxP6YFBKpWJSMAfYtL8Niv8KmmKsnpb9uQwQpg8QN2", [%{asset: "3QvxP6YFBKpWJSMAfYtL8Niv8KmmKsnpb9uQwQpg8QN2", last_price: 0.09019287, priced_in: "WAVES", volume: 13888.8199642112}, %{asset: "3QvxP6YFBKpWJSMAfYtL8Niv8KmmKsnpb9uQwQpg8QN2", last_price: 1.268e-5, priced_in: "8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS", volume: 9792.16173281305}, %{asset: "3QvxP6YFBKpWJSMAfYtL8Niv8KmmKsnpb9uQwQpg8QN2", last_price: 0.1313214, priced_in: "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p", volume: 9610.63424570971}]}.

How do I get Enum.filter to drill down to the map where priced_in is located?

Also, is the repetition of the excluded lists and the number_of_asssets_to_be_excluded functions in each function best practice?

Marked As Solved

kokolegorille

kokolegorille

It is wrong to think ‘A’ is equal to “A”, they are not. You might encounter some bad surprises if You think so :slight_smile:

Please try to understand the solution, because You should be able to write it, as descriptive as it is.

iex> excluded = ["DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p", "8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS", "2tR9EKvDPMThfrFSb96CSBGYNwNPtzwkGcdhQjv4dVoj"]
iex> trades 
|> Enum.reduce(%{}, fn {k, l}, acc -> 
  Map.put(acc, k, Enum.reject(l, & &1.priced_in in excluded)) 
end)
%{
  "3QvxP6YFBKpWJSMAfYtL8Niv8KmmKsnpb9uQwQpg8QN2" => [
    %{
      asset: "3QvxP6YFBKpWJSMAfYtL8Niv8KmmKsnpb9uQwQpg8QN2",
      last_price: 0.09019287,
      priced_in: "WAVES",
      volume: 13918.3182330112
    }
  ],
  "474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu" => [
    %{
      asset: "474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu",
      last_price: 192.01,
      priced_in: "WAVES",
      volume: 137852.319057268
    },
    %{
      asset: "474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu",
      last_price: 459.22,
      priced_in: "Ft8X1v1LTa1ABafufpaCWyVj8KkaxUWE6xBhW6sNFJck",
      volume: 513.413421879477
    }
  ],
  "4LHHvYGNKJUg5hj65aGD5vgScvCBmLpdRFtjokvCjSL8" => [
    %{
      asset: "4LHHvYGNKJUg5hj65aGD5vgScvCBmLpdRFtjokvCjSL8",
      last_price: 0.05171444,
      priced_in: "WAVES",
      volume: 14110.9296573005
    }
  ]
}

Often You will realize You can write it as a one line command.

Also Liked

kokolegorille

kokolegorille

I prefer to use Enum.reduce when I would otherwise use Enum.map followed by Enum.into. It’s an iteration less.

Enum.reduce is worth learning how to use it… It takes an enumerable, and reduce it to a single value.

In this case, the value is a map.

All of your module recursive code could be replaced by

Enum.reject(l, & &1.priced_in in excluded)

It takes a list, and rejects the items whose price_in is in excluded. In this case reject is more appropriate than filter.

Map.put(acc, k, Enum.reject(l, & &1.priced_in in excluded)) 

It takes a map, and returns a map with k set to the new list.

trades |> Enum.reduce(%{}, fn {k, l}, acc -> 

It takes a map as enumerable (trades), and set acc to the initial value of an empty map. It loops through trades, each item is a tuple of key and value. In this case value is a list.

Each iteration will return a map, which is the updated accumulator, with the key set to the new list.

Finally, it returns the final accumulator, which is what You want :slight_smile:

The Enum module is probably the most used module, and it’s worth knowing all its functions.

ericgray

ericgray

Just to add what @kokolegorille has already explained usually when you need an accumulator or you need to pass around some state Enum.reduce is usually the right tool for the job.

Matter of fact everything in the Enum module is implemented with Enum.reduce except for zip. Jose Valim explains why and when you should use Enum.reduce in one of his Twitch Videos.
When you get a chance you should watch them, you’ll learn a lot.

kokolegorille

kokolegorille

There are many errors…

When You use Enum on a map, You receive a tuple of key and value…

Enum.filter(trades, fn {_key, map} -> map.priced_in

It’s what the error message tells You…

Not only this, but the map, is not a map, it’s a list of map.

You are not using number_of_assets_to_be_excluded, then You set it to a new value.

What are You trying to do? If You want to test if a value is in a list, use Enum.member? or in.

Where Next?

Popular in Questions Top

skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
myronmarston
The Elixir Typespec docs show the following syntax for keyword lists in typespecs: # ... | [key: type] # keyword lists...
New
JeremM34
Hello, how can I check the Phoenix version ? Thanks !
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 I...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
vegabook
I’m brand new to Phoenix and I have stripped one of the demo applications to the bone. I just want to get an svg up on the screen. Here i...
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New

Other popular topics Top

sen
Hi All, I set a environment variables in dev.exs , like below code. when i start server, how can i set the ${enable} value? thanks. d...
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
985 42920 311
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
JeremM34
Hello, how can I check the Phoenix version ? Thanks !
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
chrismccord
This release brings a number of exciting features, including integration with the new Phoenix LiveDashboard and Phoenix LiveView. There h...
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
saif
Hello everyone, Long time lurker first time poster here. I’ve recently begun working on Elixir full-time again! :raised_hands: It’s been...
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" => #BSON.ObjectId<58eb1a7a9ad169198c3dXXXX>, "email" => ...
New

Latest on Elixir Forum

We're in Beta

About us Mission Statement