如何将功能仅应用于关键字列表的一个元素?

时间:2019-02-27 14:43:08

标签: elixir

说我有一个看起来像这样的关键字列表:

[a: 1, b: 2, c: 3...]

我想返回如下所示的关键字列表:

[a: f(1), b: 2, c: 3...]

f/1是我应用于元素:a的函数。

列表的长度或顺序不确定。

最好的方法是什么?

谢谢!

3 个答案:

答案 0 :(得分:1)

要应用于第一个元素:

iex(1)> [{key, value} | tail] = [a: 1, b: 2, c: 3]
[a: 1, b: 2, c: 3]
iex(2)> fun = fn(num) -> num + 1 end              
#Function<6.128620087/1 in :erl_eval.expr/5>
iex(3)> [{key, fun.(value)} | tail]               
[a: 2, b: 2, c: 3]

如果顺序和长度不确定,我建议您先翻译成地图。

如果列表较小,则可以逐个循环元素并在:a上匹配以运行函数。

答案 1 :(得分:1)

您可以使用Keyword.update!/3Keyword.update/4

list = [a: 1, b: 2, c: 3]
Keyword.update! list, :a, &(&1+1)

答案 2 :(得分:1)

您也可以使用Kernel.update_in/3(除了Keyword.update!解决方案之外)

list = [a: 1, b: 2, c: 3]
Kernel.update_in list, [:a], fn(value) -> value end

fn部分由您决定如何转换值。

编辑

如果关键字列表中有多个:a键,那么您可以将Enum.map/2用作:

list = [a: 1, b: 2, c: 3, a: 4]
Enum.map list, fn {:a, v} -> {:a, v+1}; {k,v} -> {k,v} end