Hash methods every Ruby Developer should know

Hash is a very common data structure used by Ruby developers. This article will discuss some important hash methods every Ruby developer should know.

Let’s start.

fetch

Fetch is useful when the value against a specific key is needed. If a key is not found, an exception is raised. If a key is not found but a value against it is given, it will return that value.

1
2
3
4
5
6
7
8
9
10
11
12
h = {a: 500, b: 700}
h.fetch(:a)
=> 500 

h.fetch(:b)
=> 700 

h.fetch(:c)
KeyError (key not found: :c)

h.fetch(:c, 900)
=> 900 

flatten

When called on a hash, this method returns a new one-dimensional array. Optionally, it also takes an argument that tells this method of how deep is the flattening required.

1
2
3
4
5
6
7
8
9
h = {a: 1, b: 2, c: {d: 4, e: 5}}
h.flatten
=> [:a, 1, :b, 2, :c, {:d=>4, :e=>5}] 

h = {a: 1, b: [2, 3]}
h.flatten
=> [:a, 1, :b, [2, 3]] 
h.flatten(2)
=> [:a, 1, :b, 2, 3]

include?

This method returns a value if the given key is present.

1
2
3
h = {a: 1, b: 3, c: 4}
h.include?(:a)
=> true 

merge

Merge is used to combine a set of given hashes into receiver hash.

1
2
3
4
5
6
7
8
h = {a: 1, b: 2}
h2 = {c: 3, d: 4}
h3 = {c: 5, f: 6}

h.merge(h2)
=> {:a=>1, :b=>2, :c=>3, :d=>4} 
h.merge(h2, h3)
=> {:a=>1, :b=>2, :c=>5, :d=>4, :f=>6}

select

This method returns a new hash containing the values that meet the condition specified in a block. This does not change the original hash.

1
2
3
4
5
h = {:a=>1, :b=>2, :c=>4, :d=>9}
h.select {|k, v| v > 2}
=> {:c=>4, :d=>9} 
h
=> {:a=>1, :b=>2, :c=>4, :d=>9} 

Use select! If you want to change the original hash.

reject

This method returns a new hash eliminating the values that meet the condition specified in a block. This does not change the original hash.

1
2
3
4
5
h = {:a=>1, :b=>2, :c=>4, :d=>9}
h.reject {|k, v| v > 2}
=> {:a=>1, :b=>2}
h
=> {:a=>1, :b=>2, :c=>4, :d=>9} 

Use reject! If you want to change the original hash.

transform_values

This method runs the given block once for every value in the hash and returns a new hash with updated values.

1
2
3
4
5
h = {:a=>2, :b=>5, :c=>10} 
h.transform_values {|v| v + 10 }
=> {:a=>12, :b=>15, :c=>20} 
h
=> {:a=>2, :b=>5, :c=>10} 

dig

This returns the value of nested keys.

1
2
3
h = {:a=>{:b=>{:c=>2}}}
h.dig(:a, :b, :c)
=> 2

with_indifferent_access

This method is particularly related to Ruby on Rails. In hash, a key can be of two types, string or symbol.

1
2
3
4
5
6
7
8
9
10
11
12
13
h = {a: 2, b: 5, c: 10}
h["a"]
=> nil 
h[:a]
=> 2 

require "active_support/core_ext/hash/indifferent_access"
=> true
h = {a: 2, "c": 3, d: 10}.with_indifferent_access
h["a"]
=> 2 
h[:c]
=> 3 

These are all methods that will be useful for any Ruby developer to have in their toolkit.