While Ruby’s each
method is useful, it also comes with an awesome extended family of methods that are even more powerful!
For the next few examples, we’ll work with a slightly more complex data structure. It look like this:
friends = [ { name: "Diego", status: "Online" }, { name: "Liam", status: "Away" }, { name: "Gloria", status: "Online" }, { name: "Charlie", status: "Away" } ]
select
is similar to each
in that we pass it a block to run on each element in the collection, but the similarities stop there. The important difference is that select
will return a new collection with only the items that the block returned true
for. It sounds pretty intimidating at first, so let’s walk through an example.
We can use select
to create a new Array filled with only our online friends:
online_friends = friends.select do |friend| friend[:status] == "Online" end
Because the block is so short, it would also work well as a one-liner:
online_friends = friends.select{|friend| friend[:status] == "Online"}
select
will go through each element one at a time, starting with {name: “Diego”, status: “Online”}
, passing it to the block we wrote. The block contains a single line: friend[:status] == “Online”
. That line returns either true
or false
. If the block returns true
, that specific item is added to a new Array that will be returned at the very end of select
.
This table shows each step of the process:
At the very end, select
returns this Array which we save to a new online_friends
variable:
[{ name: "Diego", status: "Online"}, { name: "Gloria", status: "Online"}]