[解決済み] reduce() メソッドを早期にブレークさせる方法は?
質問
のイテレーションを解除するにはどうすればよいのでしょうか?
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することであるなら、これは実際に最良のアプローチであると主張します。
なぜダメなのでしょうか?
関数のパラメータを変更しないのは悪い習慣である、という主張の一覧はたくさんあります。
関連
-
[解決済み】TypeError: Router.use() はミドルウェアの関数を要求しているが、Object を取得した。
-
[解決済み】React - TypeError: 未定義のプロパティ 'props' を読み取ることができない。
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] jQueryの「exists」関数はありますか?
-
[解決済み] どのラジオボタンが選択されているかをjQueryで知るにはどうしたらよいですか?
-
[解決済み] .prop() vs .attr()
-
[解決済み] Array.forEachでbreakを呼び出すようなショートサーキット
-
[解決済み] Javaでネストされたループから抜け出すには?
-
[解決済み】別のウェブページにリダイレクトするにはどうすればいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
vueネットワークリクエストソリューション ネイティブネットワークリクエストとjsネットワークリクエストライブラリ
-
JSアレイループと効率解析の比較
-
Vueはランニングライト形式のテキストを水平方向にスクロールする機能を実装している
-
Vueのイベント処理とイベントモディファイアの解説
-
[解決済み】ExpressJS : res.redirect()が期待通りに動かない?
-
[解決済み】 env: node: macにそのようなファイルやディレクトリはありません
-
[解決済み】エラー。Ionic使用中にモジュール '../lib/utils/unsupported.js' が見つかりませんでした。
-
nodejs unhandledPromiseRejectionWarning メッセージ
-
JavaScriptのgetElementById、getElementsByTagNam、getElementsByClassNameの違いと使い方
-
jq は html ページとデータを動的に分割する。