2016-04-09 19 views
14

Tôi đang cố gắng để chuyển đổi một struct để bản đồ để có thể làm sạch tất cả các giá trị nilElixir convert struct để lập bản đồ

Tôi hiện đang sử dụng mã này

case Nadia.get_updates do 
    {:ok, results} -> 
     Map.from_struct(results) 
     |> Enum.filter(fn {_, v} -> v != nil end) 
     |> Enum.into(%{}) 

Lưu ý: Nadia. get_updates trả về cấu trúc sau: https://hexdocs.pm/nadia/Nadia.Model.Update.html#t:t/0

Tuy nhiên, tôi luôn nhận được lỗi sau: không phù hợp với quy định tại khoản chức năng trong Map.from_struct/1

+5

Có thể 'kết quả' là danh sách các cấu trúc này? Không chỉ một cấu trúc? – JustMichael

Trả lời

1
01.

Nếu thành công, nó sẽ trả về danh sách Nadia.Model.Update.t. Đó là lý do tại sao bạn nhận được lỗi đó.

1

FWIW, tôi đã viết một thư viện sẽ thực hiện loại điều này cho bạn một cách tự động nếu không phải kéo cấu trúc dữ liệu ra xa nhau.

https://github.com/philosophers-stone/transform

Đây là từ mã kiểm tra:

test "implement scrub of empty values from map" do 
    data = %{ :a => nil, :b => "", :c => "a"} 
    replace_empty = fn(string, _d) -> if(string == "", do: nil , else: string) end 
    replace_nil = fn(map, _depth) -> for {k, v} <- map, v != nil , into: %{}, do: {k, v} end 
    potion = %{ BitString => replace_empty, Map => replace_nil} 

    assert PhStTransform.transform(data, potion) == %{:c => "a"} 

end 

Lưu ý, nếu dữ liệu là một danh sách các bản đồ này vẫn sẽ chỉ làm việc tốt. Thư viện PhStTransform sẽ tiếp tục kéo dữ liệu ra xa cho đến khi nó tìm thấy một bản đồ. Trong trường hợp của bạn, bạn sẽ sử dụng một hàm replace_nil mà làm việc trên các loại cấu trúc bạn quan tâm đến

6

. Có một mẹo

my_struct = %MyStruct{} 
my_map = Map.delete my_struct, :__struct__ 
18

Kể từ v0.15 chúng tôi có Map.from_struct/1 mà thực hiện chính xác này.

defmodule User do 
    defstruct [:name] 
end 

Map.from_struct(%User{name: "valim"}) 
#=> %{name: "valim"} 
Các vấn đề liên quan