Contents

Sorting Hashes in Ruby

Sorting Hashes by Key

Ascending Order

Lets say we had the following hash:

items = {
  "b": 2,
  "a": 3,
  "c": 1
}

If we wanted to sort it by keys, we can use the .sort method to sort in ascending order:

items = {
  "b": 2,
  "a": 3,
  "c": 1
}

# sorting the hash by keys. `items` is now an array
items = items.sort

The code above will result in items being an array of arrays (sorted alphabetically by keys) that looks like this:

[[:a, 3], [:b, 2], [:c, 1]]

Descending Order

To sort a hash by key in descending order, we can chain the .reverse method to the previous code:

items = {
  "b": 2,
  "a": 3,
  "c": 1
}

items = items.sort.reverse

The code above turns items into the following:

[[:c, 1], [:b, 2], [:a, 3]]

Sorting Hashes by Value

Ascending Order

To sort a hash by value, we need to use .sort_by like so:

items = {
  "b": 2,
  "a": 3,
  "c": 1
}

# sorting by values
items = items.sort_by { |k, v| v }

The code above will result in items being an array once again, but this time sorted by values in ascending order:

[[:c, 1], [:b, 2], [:a, 3]]

Descending Order

We can also use .sort_by to sort values in descending order by using -v:

items = {
  "b": 2,
  "a": 3,
  "c": 1
}

# sorting by values in descending order, note the `-v`
items = items.sort_by { |k, v| -v }

The code above transforms items into the following:

[[:a, 3], [:b, 2], [:c, 1]]

Side Note: Converting Resulting Arrays to Hashes

As a side note: if you still need the result in a hash format, you can convert the resulting array into a hash with .to_h:

items = {
  "b": 2,
  "a": 3,
  "c": 1
}

# sorting and converting the result to a hash
items = items.sort.to_h

The code above will result in items being a hash again:

{:a=>3, :b=>2, :c=>1}