Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 长生不老药从地图列表中获取信息_Elixir - Fatal编程技术网

Elixir 长生不老药从地图列表中获取信息

Elixir 长生不老药从地图列表中获取信息,elixir,Elixir,我通过post将此结构发送给我:联系人=[%{“John”=>[“0724573977”]},%{“Mary”=>[“0724573111”,“0744556778”]}这基本上是一个联系人列表,每个联系人都是一个地图姓名=>电话号码 我试着列出所有的电话号码,忽略任何名字,只是列出一个号码: a = [%{"1" => ["0724573977"]}, %{"2" => ["0724573111", "0744556778"]}] p = Enum.reduce a, [], f

我通过post将此结构发送给我:
联系人=[%{“John”=>[“0724573977”]},%{“Mary”=>[“0724573111”,“0744556778”]}
这基本上是一个联系人列表,每个联系人都是一个地图
姓名=>电话号码

我试着列出所有的电话号码,忽略任何名字,只是列出一个号码:

a = [%{"1" => ["0724573977"]}, %{"2" => ["0724573111", "0744556778"]}]

p = Enum.reduce a, [], fn(contact, acc) ->
    for {_record_id, phones} <- contact do
        for phone <- phones do
            acc ++ phone
        end
    end
end

IO.inspect p
a=[%{“1”=>[“0724573977”]},%{“2”=>[“0724573111”,“0744556778”]}]
p=Enum.reduce a,[],fn(联系人,acc)->
对于{{u record\u id,phones}来说,操作起来要简单得多:

a
|> Enum.flat_map(&Map.to_list/1)
|> Enum.flat_map(a, fn {_record_id, phones} -> phones end)

您尝试使用的代码的问题是,每次迭代
for
都会在新列表中生成一个元素,此外,由于Elixir是不可变的,因此实际上您并没有更改
acc
,而是创建了将每个电话号码附加到同一列表中的元素,因此,你最终会得到意想不到的列表。

这可能不是惯用的长生不老药,因为我对这门语言还不熟悉,但这对我很有用:

iex(11)> List.flatten(Enum.map(a, fn(x) -> Map.values(x) end))
["0724573977", "0724573111", "0744556778"]

要仅获取数字列表,可以使用:

contacts
|> Enum.map(&Map.values/1)
|> List.flatten
#⇒ ["0724573977", "0724573111", "0744556778"]

用数字代替名字,可以使用<代码> EnUM。在链表的中间有一个索引< /p> >已经有许多正确的答案已经发布,但是我想我会发布我的首选解决方案:使用<代码> <代码> > 3代码>触发器= [%{ 1 ]=> [ 0724573977 ] ] },%{ 2”=> [ 0724573111 ],“0744556778”} [%{"1" => ["0724573977"]}, %{"2" => ["0724573111", "0744556778"]}]


iex(2)>for contact看起来很棒,但是..
**(FunctionClauseError)中没有与:erl_eval.匹配的函数子句-在解释的fun中-“/1
@romemichalcea我看到我遗漏了什么(事实上这是一个地图列表)-我已经相应地更新了代码这是迄今为止最好的解决方案,应该标记为正确答案@Romeomichalcea请注意,当与确定良好的结构一起使用时,通常应避免使用
List.flatte/1
iex(1)> contacts = [%{"1" => ["0724573977"]}, %{"2" => ["0724573111", "0744556778"]}]
[%{"1" => ["0724573977"]}, %{"2" => ["0724573111", "0744556778"]}]
iex(2)> for contact <- contacts, {_, phones} <- contact, phone <- phones, do: phone
["0724573977", "0724573111", "0744556778"]