13

Loops


Symptom

Imperative for/while loops obscuring what the loop is producing — filter, map, reduce mixed together by hand.

Goal

The transformation reads as a sequence of named operations: filter, map, reduce.

Smellier version
const seniors = [];
for (const u of users) {
  if (u.age >= 65) seniors.push(u.name);
}
Fresher version
const seniors = users
  .filter(u => u.age >= 65)
  .map(u => u.name);
Savings

Intent jumps off the page; bugs concentrate on individual steps that are independently testable.

Note

Reader must mentally execute the loop to learn the result; off-by-one errors and accumulator bugs hide in the body.