web-dev-qa-db-fra.com

Remplacer un seul élément dans un tableau

J'ai un tableau avec des éléments uniques. Existe-t-il un moyen de remplacer une certaine valeur par une autre valeur sans utiliser sa valeur d'index?

Exemples:

array = [1,2,3,4]
if array.include? 4
#  "replace 4 with 'Z'"
end
array #=> [1,2,3,'Z']

hash = {"One" => [1,2,3,4]}
if hash["One"].include? 4
#  "replace 4 with 'Z'"
end
hash #=> {"One" => [1,2,3,'Z']}
8
Lasonic
p array.map { |x| x == 4 ? 'Z' : x }

# => [1, 2, 3, 'Z']
16
Johnson

Vous pouvez le faire comme:

array[array.index(4)] = "Z"

Si l'élément n'est pas nécessairement dans le tableau, alors

if i = array.index(4)
  array[i] = "Z"
end
8
sawa

Vous pouvez utiliser Array # map

array = array.map do |e|
  if e == 4
    'Z'
  else
    e
  end
end

pour éditer le tableau en place, plutôt que de créer un nouveau tableau, utilisez Array # map!

Si vous souhaitez remplacer plusieurs éléments, vous pouvez utiliser un hachage pour mapper l'ancien entre l'ancien:

replacements = {
  4 => 'Z',
  5 => 'five',
}
array = array.map do |e|
  replacements.fetch(e, e)
end

Cela utilise une fonctionnalité de Hash # fetch , où si la clé n’est pas trouvée, le deuxième argument est utilisé par défaut.

5
Wayne Conrad

Une solution très simple qui suppose qu'il n'y aura pas de doublons et que l'ordre n'a pas d'importance:

hash = { 'One' => [1, 2, 3, 4] }

hash['One'].instance_eval { Push 'Z' if delete 4 }
3
Matheus Moreira