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.