I have a map which either changes a value or sets it to nil. I then want to remove the nil entries from the list. The list doesn’t need to be kept.

This is what I currently have:

# A simple example function, which returns a value or nil
def transform(n)
  rand > 0.5 ? n * 10 : nil }
end

items.map! { |x| transform(x) } # [1, 2, 3, 4, 5] => [10, nil, 30, 40, nil]
items.reject! { |x| x.nil? } # [10, nil, 30, 40, nil] => [10, 30, 40]

I’m aware I could just do a loop and conditionally collect in another array like this:

new_items = []
items.each do |x|
    x = transform(x)
    new_items.append(x) unless x.nil?
end
items = new_items

But it doesn’t seem that idiomatic. Is there a nice way to map a function over a list, removing/excluding the nils as you go?

9 Answers
9

Tags:

Leave a Reply

Your email address will not be published. Required fields are marked *