1. ホーム
  2. javascript

[解決済み] reduce() メソッドを早期にブレークさせる方法は?

2022-06-27 16:37:53

質問

のイテレーションを解除するにはどうすればよいのでしょうか? reduce() メソッドの繰り返しを解除するにはどうしたらよいでしょうか。

for :

for (var i = Things.length - 1; i >= 0; i--) {
  if(Things[i] <= 0){
    break;
  }
};

reduce()

Things.reduce(function(memo, current){
  if(current <= 0){
    //break ???
    //return; <-- this will return undefined to memo, which is not what I want
  }
}, 0)

どのように解決するのですか?

アップデイト

の内部で早期にブレークするために、元の配列が変異しているという良い指摘をするコメンテーターもいます。 .reduce() ロジックの内部で早期にブレークするために、元の配列が変異しているという良い指摘もあります。

よって、答えを修正した やや を追加することで .slice(0) を呼び出す前に .reduce() を呼び出すと、元の配列のコピーが生成されます。 ノート : 同じタスクを達成する類似のオペは slice() (あまり明示的でない)、そしてスプレッド演算子 [...array] ( 若干パフォーマンスが劣る ). これらのすべてが、全体の実行時間 + 1*(O(1)) に線形時間の追加の定数ファクターを追加することを心に留めておいてください。

コピーは、反復処理からの排出を引き起こす最終的な変異から元の配列を保持する役割を果たします。

const array = ['apple', '-pen', '-pineapple', '-pen'];
const x = array
    .slice(0)                         // create copy of "array" for iterating
    .reduce((acc, curr, i, arr) => {
       if (i === 2) arr.splice(1);    // eject early by mutating iterated copy
       return (acc += curr);
    }, '');

console.log("x: ", x, "\noriginal Arr: ", array);
// x:  apple-pen-pineapple
// original Arr:  ['apple', '-pen', '-pineapple', '-pen']


OLD

reduce関数の第4引数: "array"を変更することで、.reduce()呼び出しの任意の反復でブレークさせることができます。カスタムreduce関数は必要ありません。参照 ドキュメント の完全なリストは .reduce() パラメータの完全なリストです。

Array.prototype.reduce((acc, curr, i, array))

第4引数は の配列です。 を反復している。

const array = ['apple', '-pen', '-pineapple', '-pen'];
const x = array
.reduce((acc, curr, i, arr) => {
    if(i === 2) arr.splice(1);  // eject early
    return acc += curr;
  }, '');
console.log('x: ', x);  // x:  apple-pen-pineapple

WHY?

提示された他の多くのソリューションの代わりにこれを使用する、私が思いつく唯一の理由は、アルゴリズムに関数型プログラミングの方法論を維持したい場合、そしてそれを達成するために可能な限り宣言的なアプローチをとりたい場合です。もし、あなたの全体のゴールが、文字通り配列を、偽りのない代替プリミティブ(文字列、数値、ブーリアン、シンボル)にREDUCEすることであるなら、これは実際に最良のアプローチであると主張します。

なぜダメなのでしょうか?

関数のパラメータを変更しないのは悪い習慣である、という主張の一覧はたくさんあります。