Fun with Enumerable#map

Ruby’s map function is great when you want to transform every item of a list in the same way. Here’s the syntax from the Ruby docs:

map { |obj| block } → array

map iterates through an enumerable object, and returns an array using the return value of the code in block for each item in the enumberable. The obj is whatever the enumerable object supplies for iteration. For an array it will be a value in the array. For a hash it will be a key-value pair.

map is a non-destructive function. It leaves your original object alone and returns a new transformed object. You can transform your items in all sorts of ways. It’s great when you have a set of data that’s just a step or two away from what you want.

Add one to every item.

[0, 5, 9].map {|value| value + 1}
#=> [1, 6, 10]

Get the first ten square numbers.

(1..10).map {|n| n * n}
#=> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Capitalize every string.

["hello", "world"].map {|word| word.to_s.upcase}
#=> ["HELLO", "WORLD"]

Simple Pig Latin with map.

["ruby", "is", "fun"].map {|word| 
    vowels = ["a","e","i","o","u"]
    if vowels.include? word[0]
        word + "yay"
        word[1..-1] + word[0] + "ay"
#=> ["ubyray", "isyay", "unfay"]

You can also use map on hashes. Just remember map always returns an array, so you have to do a little bit of extra work to change a hash to a new hash with map.

Map always returns an array, even when applied to a hash.

balances = {"Amy" => 20000.0, "Bill" => 4000.0, "Carol" => 6000.0}
interest_rate = 1.01 {|_, value| value * interest_rate]}
#=> [20200.0, 4040.0, 6060.0]

When you return key-value pairs, you still get an array. {|key, value| [key, value * interest_rate]}
#=> [["Amy", 20200.0], ["Bill", 4040.0], ["Carol", 6060.0]]

You can convert an array of key-value pair arrays to a hash using .to_h {|key, value| [key, value * interest_rate]}.to_h
#=> {"Amy"=>20200.0, "Bill"=>4040.0, "Carol"=>6060.0}

I hope these examples helped you to better understand what the map function does and how to use it.