Reason #12 • January 12th, 2026

Enumerable#group_by

This week we'll appreciate Ruby's Enumerable module by zooming in on seven different APIs it provides. We'll start with group_by.

group_by allows you to categorize elements of a collection based on some property or criteria. It receives a block and returns a hash where the keys are the results of the block and the values are arrays of elements that correspond to each key.

Ruby
numbers = [1, 2, 3, 4, 5, 6]
even_and_uneven = numbers.group_by(&:even?)
# => {false=>[1, 3, 5], true=>[2, 4, 6]}

words = %w[apple banana apricot blueberry cherry]
words_by_first_letter = words.group_by(&:first)
# => {
#  "a"=>["apple", "apricot"],
#  "b"=>["banana", "blueberry"],
#  "c"=>["cherry"]
# }

Employee = Struct.new(:name, :department)
employees = [
  Employee.new(name: "Alice", department: "Engineering"),
  Employee.new(name: "Bob", department: "HR"),
  Employee.new(name: "Charlie", department: "Engineering"),
  Employee.new(name: "Diana", department: "Marketing")
]
employees_by_department = employees.group_by(&:department)
# => {
#  "Engineering"=>[
#    #<struct name="Alice", department="Engineering">,
#    #<struct name="Charlie", department="Engineering">,
#  ],
#  "HR"=>[#<struct name="Bob", department="HR">],
#  "Marketing"=>[#<struct name="Diana", department="Marketing">]
# }
      
JavaScript
const numbers = [1, 2, 3, 4, 5, 6];
const grouped = numbers.reduce((acc, n) => {
  const even = n % 2 === 0;
  if (!acc[even]) {
    acc[even] = [];
  }
  acc[even].push(n);
  return acc;
}, {});
// => {false: [1, 3, 5], true: [2, 4, 6]}

const words = ["apple", "banana", "apricot", "blueberry", "cherry"];
const wordsByFirstLetter = words.reduce((acc, word) => {
  const letter = word[0];
  if (!acc[letter]) {
    acc[letter] = [];
  }
  acc[letter].push(word);
  return acc;
}, {});
// => {
//  a: ["apple", "apricot"],
//  b: ["banana", "blueberry"],
//  c: ["cherry"]
// }

const employees = [
  { name: "Alice", department: "Engineering" },
  { name: "Bob", department: "HR" },
  { name: "Charlie", department: "Engineering" },
  { name: "Diana", department: "Marketing" }
];
const employeesByDepartment = employees.reduce((acc, employee) => {
  if (!acc[employee.department]) {
    acc[employee.department] = [];
  }
  acc[employee.department].push(employee);
  return acc;
}, {});
// => {
//  Engineering: [
//    { name: "Alice", department: "Engineering" },
//    { name: "Charlie", department: "Engineering" },
//  ],
//  HR: [{ name: "Bob", department: "HR" }],
//  Marketing: [{ name: "Diana", department: "Marketing" }]
// }
      

When the code comparisons speak for themselves it makes my job easier

The group_by method was added in Ruby 1.8.7, released in 2008.