2017-09-20 7 views
1

Enum.map peut être utilisé pour modifier les valeurs des éléments impairs d'une liste:Enum.map_every même nombre

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

Cependant, il semble qu'il doit y avoir un décalage de 1 à faire de même pour la même éléments de la liste.

Y a-t-il une fonction qui peut directement map_every nombre pair?

+0

Je dirais qu'il n'y a pas. Très probablement, vous devrez l'implémenter d'une manière un peu plus compliquée. – JustMichael

Répondre

2

Tout déplacement de la liste initiale fonctionne, je ne pense pas vraiment que c'est la bonne façon d'aller. Que l'on a besoin des même éléments à être mis à jour, cela pourrait être fait explicitement:

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] 

de même pour toute condition lourde: un juste appelle Enum.map_every/3 avec l'argument nth mis à 1 et effectue un contrôle supplémentaire dans la réducteur, renvoyant soit la valeur modifiée, soit l'original.


La condition doit être appliquée à un indice, enveloppez l'entrée en utilisant 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) 
+0

Bien que cela fonctionne pour tous les éléments pairs, j'ai compris que la question était "tous les numéros d'index de tableau". Lorsque seulement l'élément est important, vous pouvez également passer directement à 'Enum.map/2' au lieu de' Enum.map_every/3'. –

+0

@JonasDellinger merci, en effet, mis à jour. – mudasobwa

2

Il n'y a aucune fonction qui fait cela.

Cependant, il peut être réalisé avec 2 lignes en déplaçant le tableau et en utilisant Enum.map_every/3

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] 

Vous pouvez également créer une fonction comme ci-dessous. Il va commencer la cartographie à la condition nth, au lieu du premier élément:

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 
+0

Merci - Je pense qu'il devrait aussi y avoir un argument supplémentaire offset à 'Enum.map_every'. – category