Skip to content

No Reduce Accumulator Copy

Error
small-rules/no-reduce-accumulator-copy

Disallow copying growing reducer accumulators with Object.assign, Array.from, or array copy methods.

Rationale

Ported from dmmulroy/anti-slop. A reduce that copies its accumulator on each step does more work as the result grows. That turns a linear pass into quadratic work. Build a new accumulator in the reduce call, change it in place, and return it. Pair this rule with Oxc’s no-accumulating-spread, which catches the spread form.

Diagnostic Messages

accumulatorCopy
Do not copy the reducer accumulator on every iteration; growing copies can cause quadratic work. Mutate a fresh, locally owned accumulator and return it, or use an iterator pipeline or flatMap.

Configuration

This rule does not accept options.

{
"jsPlugins": [
"@pobammer-ts/small-rules"
],
"rules": {
"small-rules/no-reduce-accumulator-copy": "error"
}
}

Examples

Object.assign copy of the accumulator
const byId = items.reduce((accumulator, item) => Object.assign({}, accumulator, { [item.id]: item }), {});
mutating a locally owned accumulator
const byId = items.reduce<Record<string, Item>>((accumulator, item) => {
accumulator[item.id] = item;
return accumulator;
}, {});