使用structs Elixir更新列表
我有一个对象使用structs Elixir更新列表,elixir,phoenix-framework,Elixir,Phoenix Framework,我有一个对象 %{ shares: [] } 我想通过Enum将结构%Cs{name:“Junaid1”},%Cs{name:“Junaid2”}添加到列表中。每个或映射都可以这样做吗 好的,再简单一点,我再次更新问题 Enum.each(email_array, fn (email) -> with {:found_user, sharee} <- ensure_user(email) do case CameraShare.create_sha
%{
shares: []
}
我想通过Enum将结构%Cs{name:“Junaid1”}
,%Cs{name:“Junaid2”}
添加到列表中。每个或映射都可以这样做吗
好的,再简单一点,我再次更新问题
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)
其中,由于每个共享的类型都是%CameraShare{{uuuuu meta}:{u35; exto.Schema.Metadata}
您可以创建如下简单方法:
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"}]}
您可以创建如下简单方法:
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"}]}
Straigt列表串联
理解力
Enum.into
FWIW:
将元素添加到现有列表中:
list = []
element = 42
list1 = [element | list]
#⇒ [42]
list2 = [element | list1]
#⇒ [42, 42]
对更新问题的答复(简化):
Enum.reduce(email_数组,{[],[]},fn
电子邮件,{共享,更改}=\u acc->
与{:found_user,share}
{[camera_share | shares],changes}
{:错误,变更集}->
{共享,[变更集|变更]}
结束
其他的
#基本相同
#确保所有分支都返回一个acumulator
结束
(完)
上面将返回一个元组{shares,changes}
,您可以将其分配给任何对象
Straigt列表串联
理解力
Enum.into
FWIW:
将元素添加到现有列表中:
list = []
element = 42
list1 = [element | list]
#⇒ [42]
list2 = [element | list1]
#⇒ [42, 42]
对更新问题的答复(简化):
Enum.reduce(email_数组,{[],[]},fn
电子邮件,{共享,更改}=\u acc->
与{:found_user,share}
{[camera_share | shares],changes}
{:错误,变更集}->
{共享,[变更集|变更]}
结束
其他的
#基本相同
#确保所有分支都返回一个acumulator
结束
(完)
上面将返回一个元组{shares,changes}
,您可以将其分配给任何对象。到目前为止您尝试了什么,目前得到了什么结果?好的,谢谢。我又更新了一次。。以一种非常简单的方式,你可以理解它,到目前为止你尝试了什么,你现在得到了什么结果?好的,谢谢。我又更新了一次。。用一种非常简单的方法,在你能真正理解它的地方,问题就从这一点开始[%{name:“Junaid1”},%{name:“Junaid2”}]
如何将所有这些值放在列表中?由于在一次操作之后,用户将获得一个%{name:“Junaid1”}
,问题是如何将所有这些保存在一个列表中add_shares=[%{name:“Junaid1”},%{name:“Junaid2”}]
目标是实现此状态。。如何将这些值保存在一个枚举中。每个值或映射感谢您的回答,非常感谢。但是我已经更新了。。再解释一下我想要达到的目标。这就是我目前所处的困境。[%{name:“Junaid1”},%{name:“Junaid2”}]
如何做到这一点正如你所看到的,一切都在一个循环中,我想把所有的相机共享和错误放在一起实际上,问题就从这一点开始了[%{name:“Junaid1”},%{name:“Junaid2”}]
如何将所有这些值放在列表中?由于在一次操作之后,用户将获得一个%{name:“Junaid1”}
,问题是如何将所有这些保存在一个列表中add_shares=[%{name:“Junaid1”},%{name:“Junaid2”}]
目标是实现此状态。。如何将这些值保存在一个枚举中。每个值或映射感谢您的回答,非常感谢。但是我已经更新了。。再解释一下我想要达到的目标。这就是我目前所处的困境。[%{name:“Junaid1”},%{name:“Junaid2”}]
如何做到这一点,正如你所看到的,一切都在一个each循环中,我希望所有的相机共享和错误都在一起
%{map | shares: Enum.into(add_shares, map[:shares], & &1)}
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)