代码之家  ›  专栏  ›  技术社区  ›  Junaid Farooq

使用structs Elixir更新列表

  •  1
  • Junaid Farooq  · 技术社区  · 9 年前

    %{
      shares: []
    }
    

    %Cs{name: "Junaid1"} %Cs{name: "Junaid2"} 通过进入列表 Enum.each map ,这可能吗?

    好的,再简单一点,我再次更新问题。。

     Enum.each(email_array, fn (email) ->
        with {:found_user, sharee} <- ensure_user(email)
        do
          case CameraShare.create_share(camera, sharee, caller, params["rights"], params["message"]) do
            {:ok, camera_share} ->
               #Add camera_share to list
            {:error, changeset} ->
              #Add error to a list
          end
        else
          {:not_found, email} ->
            case CameraShareRequest.create_share_request(camera, email, caller, params["rights"], params["message"]) do
              {:ok, camera_share_request} ->
                #Add camera_share to list
              {:error, changeset} ->
                #Add error to list
            end
        end
      end)
    

    然后在枚举的末尾。每个..将有一个映射作为

    %{
       shares: [all shares],
       errors: [all errors]
    }
    

    %CameraShare{__meta__: #Ecto.Schema.Metadata<:loaded, "camera_shares">}

    2 回复  |  直到 9 年前
        1
  •  2
  •   Aleksei Matiushkin    9 年前
    map = %{
      shares: [%{name: "Junaid0"}]
    }
    add_shares = [%{name: "Junaid1"}, %{name: "Junaid2"}]
    

    Straigt列表连接

    %{map | shares: map[:shares] ++ add_shares}
    

    %{map | shares: (for share <- add_shares, into: map[:shares], do: share)}
    

    Enum.reduce

    Enum.reduce(add_shares, map, fn share, acc ->
      %{acc | shares: [share | acc[:shares]]}
    end)
    

    Enum.into

    %{map | shares: Enum.into(add_shares, map[:shares], & &1)}
    

    FWIW:

    将元素添加到现有列表中:

    list = []
    element = 42
    
    list1 = [element | list]
    #⇒ [42]
    list2 = [element | list1]
    #⇒ [42, 42]
    

    Enum.reduce(email_array, {[], []}, fn
      email, {shares, changes} = _acc ->
        with {:found_user, sharee} <- ensure_user(email) do
          case :camera_share do
            {:ok, camera_share} ->
               {[camera_share | shares], changes}
            {:error, changeset} ->
               {shares, [changeset | changes]}
          end
        else
          # basically the same
          # make sure ALL branches return an acumulator
        end
      end)
    

    上面的将返回一个元组 {shares, changes}

        2
  •  0
  •   Sheharyar    9 年前

    您可以创建如下简单方法:

    def add_share(%{shares: shares} = map, share) do
      %{ map | shares: [share | shares] }
    end
    

    并调用它将项目添加到地图中的列表中:

    %{shares: []}
    |> add_share(%Cs{name: "Junaid1"})
    |> add_share(%Cs{name: "Junaid2"})
    

    结果:

    %{shares: [%Cs{name: "Junaid2"}, %Cs{name: "Junaid1"}]}