Array#zip Method

Let’s say that you want to compare two arrays, element by element so you can find the differences.

Or maybe you want to find the biggest number on every index, or you just want to merge a list of keys & a list of values to build a hash…

…the “hard way” to do this would look something like this.

Example:

a = [1,2,3,4,5]
b = [1,2,3,6,8]

c = a.map.with_index { |_, idx| [a[idx], b[idx]] }

# [[1, 1], [2, 2], [3, 3], [4, 6], [5, 8]]

That gets the job done, but it’s not pretty, right?

In addition, you also have to stop & think for a minute to understand what’s going on.

Here’s is where Array#zip (also Enumerable#zip) comes into play!

Example:

a = [1,2,3,4,5]
b = [1,2,3,6,8]

c = a.zip(b)

# [[1, 1], [2, 2], [3, 3], [4, 6], [5, 8]]

Aha! …much better.

Don’t you agree?

If we are familiar with zip we will instantly understand what’s going on. And if we don’t, a quick read of the documentation (or even better, this article!) will explain it.

Another advantage of using zip is that we can easily chain it with other Enumerable methods.

Like for example, the count method:

a = [1,2,3,4,5]
b = [1,2,3,6,8]

c = a.zip(b).count { |a,b| a == b }

# 3

This code returns a count of exactly how many elements are the same & in the same position.

Another trick you can use, as I mentioned before, is to merge a list of keys & values to build a hash.

Example:

a = %w(bacon coconut walnuts)
b = [100, 200, 300]

a.zip(b).to_h

# {"bacon"=>100, "coconut"=>200, "walnuts"=>300}

Want another example?

Ok!

Here it is:

letters = Array('a'..'z')
shift   = 3

translation_map = letters.zip(letters.rotate(shift)).to_h

"hello".chars.map { |ch| translation_map[ch] }.join

This is a fancy implementation of the caesar cipher algorithm.

Summary

You learned about the Array#zip method, which allows you to “merge” two arrays & do some cool tricks with that 🙂

If you enjoyed this post don’t forget to share it on your favorite social network so more people can read it!

Code Reading Adventures: Awesome Print Gem

Awesome print is a nice gem that formats your output in irb & pry to make it more readable. For example… This is what displaying a hash with awesome_print looks like: But how does this work? “Truth can only be found in one place: the code.” ― Robert C. Martin Let’s take a look at … Read more

A Quick Analysis of How Sinatra Works

Sinatra is a Ruby web framework. It’s like Rails little brother… Let’s explore how Sinatra works: What happens when you require Sinatra into your project? How does route matching work? How are requests & responses processed? So many questions, but so little time… No problem! I did the hard work for you & put together … Read more