2015-12-29 27 views

Odpowiedz

17

Można mapować na listy i zwróci id używając Enum.map/2

Enum.map(list_with_maps, fn (x) -> x["id"] end) 
[1, 2] 

Możesz napisać tę samą funkcję, za pomocą operatora capture:

Enum.map(list_with_maps, & &1["id"]) 

Wolę pisanie & &1["id"] jak &(&1["id"]) ale nawiasy są opcjonalne.

2

Dla Uzupełniająco do odpowiedzi na to pytanie można też zrobić coś takiego:

defmodule Test do 
    def get_all_ids([head | tail ]) do 
    IO.puts head["id"] 
    get_all_ids(tail) 
    end 

    def get_all_ids([]) do 
    IO.puts "end" 
    end 
end 

który byłby używany tak:

iex(7)> Test.get_all_ids(list_with_maps) 
1 
2 
end 
:ok 

Chociaż myślę @ odpowiedź Gazler jest lepsza odpowiedź w tym przypadku.

No i skoro wyraźnie wymienione pasujące do wzorca, to również działa:

defmodule Test do 
    def get_all_ids([%{"id" => id} = m | tail ]) do 
    IO.puts id 
    get_all_ids(tail) 
    end 

    def get_all_ids([]) do 
    IO.puts "end" 
    end 
end 

Wezwanie będzie dokładnie taka sama; różnica w drugim podejściu polega na tym, że używa się dopasowania wzorca do analizy mapy na liście argumentów.

Możesz również zmienić listę argumentów w tym wierszu: def get_all_ids([%{"id" => id} = m | tail ]) do na: def get_all_ids([%{"id" => id} = _m | tail ]) do, aby uniknąć ostrzeżenia o nieużywanym numerze m.

2

Bardziej ogólne (i prostsze) sposób uzyskiwania podzbiór klucze Map jest użycie Map.take/2, które można wykorzystać tak:

map = %{"id" => 1, "name" => "a"} 
Map.take(map, ["id"]) 
> %{"id" => 1} 

Jak widać, potrzeba tablicę kluczy i zwraca nową mapę z tylko wybranymi kluczami.

Teraz zastosowanie tej listy jest tak proste, jak użycie mapy, a następnie użycie funkcji mappera w postaci Map.take/2.Jak już wspomniano, można to zrobić albo za pomocą lambda:

Enum.map(list_with_maps, fn (map) -> Map.take(map, ["id"]) end) 

Albo można użyć przechwytywanie:

Enum.map(list_with_maps, &(Map.take(&1, ["id"]))) 

Spowoduje to utworzenie mapy bardziej pośrednie, ale w większości przypadków, że wygrał” t być problemem, jak Elixir jest całkiem mądry o pamięci ponownego użycia i nie będzie faktycznie tworzyć tych obiektów sporo czasu, unles

1

Aby wyodrębnić wartość nazwę z listy map

names = for %{name: n, id: _} <- list_with_maps, do: n 
Powiązane problemy