Enum.map_every偶数

时间:2017-09-20 14:56:09

标签: numbers elixir enumerable

Enum.map可用于更改列表中奇数元素的值:

iex(13)> [1,2,3,4,5,6] |> Enum.map_every(2, &(&1 + 100))
[101, 2, 103, 4, 105, 6]

然而,似乎需要有1的偏移才能对列表的偶数元素执行相同的操作。

是否有直接map_every偶数的函数?

2 个答案:

答案 0 :(得分:2)

没有这样做的功能。

但是,通过移动数组并使用Enum.map_every/3

可以实现2行
iex(1)> [head | tail] = [1,2,3,4,5,6]
[1, 2, 3, 4, 5, 6]
iex(2)> [head | Enum.map_every(2, tail, &(&1 + 100))]
[1, 102, 3, 104, 5, 106]

您还可以构建如下功能。它将在提供的nth处开始映射,而不是第一个元素:

def map_every_alt(enumerable, nth, fun) when nth > 0 do
  Enum.take(enumerable, nth - 1) ++
    Enum.map_every(Enum.drop(enumerable, nth - 1), nth, fun)
end

答案 1 :(得分:2)

在移动原始列表的同时,我并不认为这是正确的方法。无论是否需要更新 even 元素,都可以明确地完成:

require Integer

[1,2,3,4,5,6]
|> Enum.map_every(1, &(if Integer.is_even(&1), do: &1 + 100, else: &1))
#⇒ [1, 102, 3, 104, 5, 106]

同样适用于任何繁琐的条件:只需调用Enum.map_every/3并将nth参数设置为1,并在reducer中执行额外检查,返回修改后的值或原始值之一。

条件应该应用于索引,使用Enum.with_index/1

包装输入
[1,2,3,4,5,6]
|> Enum.with_index
|> Enum.map_every(1, fn {e, idx} ->
     if Integer.is_even(idx), do: e + 100, else: e
   end)