Skip to content
← Back to rules

oxc/no-accumulating-spread パフォーマンス

何をするか

Array.prototype.reduce() およびループ内で累積変数(アキュムレーター)に対してオブジェクトや配列のスプレッドを使用することを防ぎます。

なぜ問題なのか

オブジェクトや配列のスプレッドは、各反復ごとに新しいオブジェクトまたは配列を作成します。最悪の場合、メモリと実行時間の両方で O(n) のコピーが発生します。累積変数に使用すると、結果として O(n^2) のメモリ複雑度および O(n^2) の実行時間複雑度につながる可能性があります。

より詳細な説明については、Prateek Surana 氏の ブログ記事 を参照してください。

このルールに違反している 誤り なコードの例:

javascript
arr.reduce((acc, x) => ({ ...acc, [x]: fn(x) }), {});
Object.keys(obj).reduce((acc, el) => ({ ...acc, [el]: fn(el) }), {});

let foo = [];
for (let i = 0; i < 10; i++) {
  foo = [...foo, i];
}

このルールに準拠している 正しい コードの例:

javascript
function fn(x) {
  // ...
}

arr.reduce((acc, x) => acc.push(fn(x)), []);
Object.keys(obj).reduce((acc, el) => {
  acc[el] = fn(el);
}, {});
// スプレッドを使うべきではない場合もあるが、このルールでは禁止されていない
Object.keys(obj).reduce((acc, el) => {
  acc[el] = { ...obj[el] };
  return acc;
}, {});

let foo = [];
for (let i = 0; i < 10; i++) {
  foo.push(i);
}

使用方法

設定ファイルまたは CLI でこのルールを 有効化 するには、以下のようにします。

json
{
  "rules": {
    "oxc/no-accumulating-spread": "error"
  }
}
bash
oxlint --deny oxc/no-accumulating-spread

参照