やりたいこと
Array#delete や Array#reject を使って配列から任意の要素を削除する場合、その要素が重複している場合はすべて削除してしまう。
animals = ['🐈', '🐈', '🐕', '🐕', '🐈']
animals.delete('🐕') # destructive
#=> "🐕"
animals
#=> ["🐈", "🐈", "🐈"]
animals = ['🐈', '🐈', '🐕', '🐕', '🐈']
animals.reject { |animal| animal == '🐕' } # not destructive
#=> ["🐈", "🐈", "🐈"]
これを 1 要素のみ削除するようにしたい。
# こうしたい。
["🐈", "🐈", "🐕", "🐈"]
方法
Array#index でインデックス値を取得し、その値を利用して要素を削除する。
animals = ['🐈', '🐈', '🐕', '🐕', '🐈']
animals.delete_at(animals.index('🐕')) # destructive
#=> "🐕"
animals
#=> ["🐈", "🐈", "🐕", "🐈"]
animals = ['🐈', '🐈', '🐕', '🐕', '🐈']
animals.reject.with_index { |_, i| i == animals.index('🐕') } # not destructive
#=> ["🐈", "🐈", "🐕", "🐈"]