Lint Rules

noAccumulatingSpread (since v12.1.0)

Disallow the use of spread (...) syntax on accumulators.

Spread syntax allows an iterable to be expanded into its individual elements.

Spread syntax should be avoided on accumulators (like those in .reduce) because it causes a time complexity of O(n^2) instead of O(n).

Source: https://prateeksurana.me/blog/why-using-object-spread-with-reduce-bad-idea/

Examples

Invalid

var a = ['a', 'b', 'c'];
a.reduce((acc, val) => [...acc, val], []);
nursery/noAccumulatingSpread.js:2:25 lint/nursery/noAccumulatingSpread ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

   Avoid the use of spread (`...`) syntax on accumulators.
  
    1 │ var a = ['a', 'b', 'c'];
  > 2 │ a.reduce((acc, val) => [...acc, val], []);
                           ^^^^^^
    3 │ 
  
   Spread syntax should be avoided on accumulators (like those in `.reduce`) because it causes a time complexity of `O(n^2)`.
  
var a = ['a', 'b', 'c'];
a.reduce((acc, val) => {return [...acc, val];}, []);
nursery/noAccumulatingSpread.js:2:33 lint/nursery/noAccumulatingSpread ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

   Avoid the use of spread (`...`) syntax on accumulators.
  
    1 │ var a = ['a', 'b', 'c'];
  > 2 │ a.reduce((acc, val) => {return [...acc, val];}, []);
                                   ^^^^^^
    3 │ 
  
   Spread syntax should be avoided on accumulators (like those in `.reduce`) because it causes a time complexity of `O(n^2)`.
  
var a = ['a', 'b', 'c'];
a.reduce((acc, val) => ({...acc, [val]: val}), {});
nursery/noAccumulatingSpread.js:2:26 lint/nursery/noAccumulatingSpread ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

   Avoid the use of spread (`...`) syntax on accumulators.
  
    1 │ var a = ['a', 'b', 'c'];
  > 2 │ a.reduce((acc, val) => ({...acc, [val]: val}), {});
                            ^^^^^^
    3 │ 
  
   Spread syntax should be avoided on accumulators (like those in `.reduce`) because it causes a time complexity of `O(n^2)`.
  

Valid

var a = ['a', 'b', 'c'];
a.reduce((acc, val) => {acc.push(val); return acc}, []);