Как мне написать функцию для передачи в Enum.map при перечислении карты? - PullRequest
0 голосов
/ 22 февраля 2019
iex(121)> val_map = %{"pri" => %{"tit" => "name1"}}
iex(122)> fp = fn (new_map) -> Map.get(new_map, "pri") end

ошибка следующего повышения

iex(123)> Enum.each(val_map, fp)
** (BadMapError) expected a map, got: {"pri", %{"tit" => "name1"}}
    (elixir) lib/map.ex:437: Map.get({"pri", %{"tit" => "name1"}}, "pri", nil)
    (elixir) lib/enum.ex:771: anonymous fn/3 in Enum.each/2
    (stdlib) maps.erl:257: :maps.fold_1/3
    (elixir) lib/enum.ex:1941: Enum.each/2

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Трудно сказать из вашего кода, какова ваша цель, может быть, вы просто экспериментируете с Enum, но, возможно, Map.values/1 - лучший выбор здесь?

iex(1)> val_map = %{"pri" => %{"tit" => "name1"}, "sec" => %{"tat" => "name2"}}
%{"pri" => %{"tit" => "name1"}, "sec" => %{"tat" => "name2"}}
iex(2)> Map.values(val_map)
[%{"tit" => "name1"}, %{"tat" => "name2"}]

Отвечая на разъяснения в комментариях, вы можете сделать это так:

iex(1)> val_map = %{"pri" => %{"tit" => "name1"}, "sec" => %{"tit" => "name2"}}
%{"pri" => %{"tit" => "name1"}, "sec" => %{"tit" => "name2"}}
iex(2)> Enum.map(val_map, fn {k, %{"tit" => v}} -> %{k => v} end)
[%{"pri" => "name1"}, %{"sec" => "name2"}]
0 голосов
/ 22 февраля 2019

Когда вы перебираете карту, она превращается в список ключевых слов (т. Е. Вы используете кортеж):

Enum.each  %{a: 1, b: 2, c: 3},  fn {key, value} ->
  IO.puts "#{key} : #{value}"
end 

В вашем случае вам нужно сопоставить часть keyвы кортеж:

val_map = %{"pri" => %{"tit" => "name1"}}
fp = fn ({"pri", value}) -> value; {other_key, value} -> value end

Где во второй части вы можете сделать что-то еще со значением: преобразовать, не возвращать его и т. д.

В этом случае он вернет массивкарт (значений) с вашей исходной карты:

Enum.each(val_map, fp)
# [%{"tit" => "name1"}]
...