es-toolkit/compat の reduceRight 完全ガイド:Lodash 互換の右方向畳み込みの仕組みと実装 es-toolkit/compat の reduceRight 完全ガイドLodash 互換の右方向畳み込みの仕組みと実装【免费下载链接】es-toolkitA modern JavaScript utility library thats 2-3 times faster and up to 97% smaller, a major upgrade to lodash.项目地址: https://gitcode.com/GitHub_Trending/es/es-toolkitreduceRightは、配列やオブジェクトを右から左へ反復処理しながら、すべての要素を 1 つの累積値に畳み込む関数です。es-toolkit の Lodash 互換レイヤーes-toolkit/compatに実装されており、Array.prototype.reduceRightと異なり、配列・配列ライク・オブジェクトを単一 API で扱えるのが特徴です。本記事では、ドキュメント docs/ja/compat/reference/array/reduceRight.md を軸に、実装 src/compat/array/reduceRight.ts とテスト src/compat/array/reduceRight.spec.ts を照合しながら、使用方法・パラメータ・内部動作・性能上の注意点までを解説します。::: warning 性能に関する重要なお知らせこのreduceRight関数は、複雑な型処理と多様な入力形式のサポートにより、動作が遅くなります。パフォーマンスが重要な場面では、より高速で現代的なArray.prototype.reduceRightメソッドを、オブジェクトを扱う場合はObject.valuesと組み合わせて使用してください。:::概要右方向からの畳み込みとはreduceRightは、配列またはオブジェクトを右から左へ反復処理して、1 つの値に縮小します。左方向のreduceが先頭要素から順に処理するのに対し、reduceRightは末尾要素から先頭要素に向かって処理を進める点が最大の違いです。const result reduceRight(collection, iteratee, initialValue);反復処理の順序が逆になるため、文字列の逆順連結や、後から追加されたキーを優先して処理するようなケースで威力を発揮します。基本的な使用法reduceRight(collection, iteratee, initialValue)配列またはオブジェクトのすべての要素を右から左へ反復処理しながら累積値を計算します。初期値を提供するとその値から始まり、提供しない場合は最後の要素が初期値となり、後ろから 2 番目の要素から反復処理を開始します。import { reduceRight } from es-toolkit/compat; // 配列を右から文字列に結合 const letters [a, b, c, d]; const result reduceRight(letters, (acc, value) acc value, ); console.log(result); // dcba // オブジェクトの値をキー順序の逆順で乗算 const numbers { x: 2, y: 3, z: 4 }; const product reduceRight(numbers, (acc, value) acc * value, 1); console.log(product); // 24 (1 * 4 * 3 * 2)オブジェクトの場合、JavaScript のObject.keysが返すキー順序の逆順つまり最後に定義されたキーからで値が処理されることに注意してください。初期値を省略した場合初期値を提供しない場合、コレクションの最後の要素配列ならcollection[collection.length - 1]、オブジェクトなら最後のキーに対応する値が初期値となり、後ろから 2 番目の要素から反復処理を開始します。import { reduceRight } from es-toolkit/compat; const numbers [1, 2, 3, 4]; const sum reduceRight(numbers, (acc, value) acc value); console.log(sum); // 10 (4 3 2 1) // 空の配列は undefined を返す const empty []; const result reduceRight(empty, (acc, value) acc value); console.log(result); // undefined初期値なしで空のコレクションを渡すと、処理対象が存在しないためundefinedが返ります。一方、初期値を渡した場合は、コレクションが空でも初期値がそのまま返されますテストshould support empty collections with an initial \accumulator value で検証済み。パラメータパラメータ型説明collectionT[] \| ArrayLikeT \| Recordstring, T \| null \| undefined反復処理する配列またはオブジェクトiteratee(accumulator: any, value: any, index: PropertyKey, collection: any) any各要素に対して呼び出す関数。累積値、現在の値、インデックス/キー、元の配列/オブジェクトを受け取るinitialValueanyオプション累積値の初期値。提供しない場合、最後の要素が初期値になる戻り値any— すべての要素を処理した後の最終累積値を返します。実装から読み解く内部動作実装は src/compat/array/reduceRight.ts にあります。核心部分の動作を分解すると次のようになります。1. 初期値の有無は引数個数で判定const hasAccumulator arguments.length 3;初期値の有無をarguments.length 3で判定しています。これは「第 3 引数が明示的に渡されたか」を厳密にチェックするためです。初期値としてnullやundefinedを明示的に渡した場合でも、引数個数が 3 以上ならば「初期値あり」として扱われます。テストshould respect nullish initial \accumulator valuesでは、nullやundefined を初期値として渡した際に、それらがそのまま第 1 引数として iteratee に渡されることを確認しています。2.isArrayLikeで配列とオブジェクトを分岐if (isArrayLike(collection)) { keys range(0, collection.length).reverse(); // ... } else { keys Object.keys(collection).reverse(); // ... }入力が配列ライクかどうかは src/compat/predicate/isArrayLike.ts のisArrayLikeで判定します。実装は「value ! nullかつ関数でなく、かつlengthが有効な長さisLengthを満たすであること」を確認するだけの軽量なチェックです。これにより、配列だけでなく{ 0: a, 1: b, length: 2 }のような配列ライクオブジェクトや文字列も配列として扱われます。配列ライクの場合、src/math/range.ts のrangeでインデックス列[0, 1, ..., length-1]を生成し、.reverse()で右方向の走査順序を構築します。オブジェクトの場合はObject.keys(collection).reverse()でキー列を逆順にします。3. 初期値なしの場合は末尾要素を初期値にif (!hasAccumulator collection.length 0) { accumulator (collection as ArrayLikeany)[collection.length - 1]; startIndex 1; } else { startIndex 0; }初期値がなく要素が存在する場合は、最後の要素を初期値にセットし、startIndex 1として後ろから 2 番目の要素からループを開始します。初期値がある場合はstartIndex 0で末尾要素から処理します。4. iteratee に渡される 4 つの引数for (let i startIndex; i keys.length; i) { const key keys[i]; const value (collection as any)[key]; accumulator iteratee(accumulator, value, key, collection); }iteratee には(累積値, 現在の値, インデックス/キー, 元のコレクション)の 4 引数が渡されます。テストshould provide correct \iteratee arguments when iterating an arrayでは、reduceRight(array, fn, 0)を呼んだとき最初の呼び出し引数が[0, 3, 2, array]になること、初期値なしでは[3, 2, 1, array]になることが検証されています。オブジェクトについても同様に[0, 2, b, object] の形で検証されていますsrc/compat/array/reduceRight.spec.ts。5. 空・falsy コレクションの早期リターンif (!collection) { return accumulator; }null・undefinedが渡された場合は即座にaccumulatorを返します。初期値もなければundefinedが返るため、Lodash と同じく「空コレクション 初期値なし undefined」という挙動が保証されます。TypeScript 型定義5 つのオーバーロードreduceRightは src/compat/array/reduceRight.ts で 5 つのオーバーロードを定義しており、入力の種類配列 / 配列ライク / オブジェクトと初期値の有無に応じて、戻り値の型が精密に推論されます。配列 初期値あり(collection: T[], callback: MemoListIteratorT, U, T[], accumulator: U) U配列ライク 初期値あり(collection: ArrayLikeT, callback: MemoListIteratorT, U, ArrayLikeT, accumulator: U) Uオブジェクト 初期値あり(collection: T extends object, callback: MemoObjectIteratorT[keyof T], U, T, accumulator: U) U配列 / 配列ライク 初期値なし T | undefinedオブジェクト 初期値なし T[keyof T] | undefinediteratee の型は配列用の MemoListIterator(prev: R, curr: T, index: number, list: A) Rとオブジェクト用の MemoObjectIterator(prev: R, curr: T, key: string, list: A) Rで区別されており、配列では第 3 引数がnumber、オブジェクトではstringとして型付けされます。テストで確認できる仕様の詳細src/compat/array/reduceRight.spec.ts には、Lodash との互換性を保証するための仕様が網羅されています。初期値なしで要素がある場合、最後の要素がデフォルトの accumulator になるshould use the last element of a collection as the default \accumulator空コレクション 初期値なしはundefinedを返すempties配列の全パターンで検証空コレクション 初期値ありは初期値をそのまま返すshould support empty collections with an initial \accumulator value初期値としてnull/undefinedを明示的に渡せるshould respect nullish initial \accumulator valuesisArrayLikeの判定に従って配列ライクを検出するshould use \isArrayLike to determine whether a value is array-like。{ length: -1 }、{ length: 1 }、{ length: 1.1 }、{ length: MAX_SAFE_INTEGER 1 } などは配列ライク扱いになりません反復処理中に追加されたオブジェクトプロパティは無視されるshould ignore added \object properties。これはObject.keys のスナップショットを先に取得している実装上の特性ですエクスポート経路と利用方法reduceRightは src/compat/compat.ts からエクスポートされており、es-toolkit/compatを経由して利用できます。パッケージ全体の互換レイヤーであるcompatは、Lodash からの移行を目的とした API を提供しており、reduce左方向とreduceRight右方向のペアで利用するのが一般的です。import { reduceRight } from es-toolkit/compat;まとめ使い分けのポイントreduceRightは、右方向の畳み込みが必要で、かつ配列・配列ライク・オブジェクトを横断的に扱いたい場合に適した互換 API です。一方で、ドキュメント冒頭の警告にある通り、型の分岐やキー列の生成といったオーバーヘッドが存在するため、単純な配列に対してはネイティブのArray.prototype.reduceRightを、オブジェクトに対してはObject.values(obj).reduceRight(...)を使う方が高速です。型の安全な推論が欲しい場面 →reduceRightオーバーロードによる精密な型付けLodash からの移行をスムーズに行いたい場面 →reduceRightパフォーマンスが最優先の場面 →Array.prototype.reduceRight/Object.valuesreduceRight用途に応じて、互換 API とネイティブ API を使い分けるのが es-toolkit の設計思想です。【免费下载链接】es-toolkitA modern JavaScript utility library thats 2-3 times faster and up to 97% smaller, a major upgrade to lodash.项目地址: https://gitcode.com/GitHub_Trending/es/es-toolkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考