昔は
_.map(items, (item, index) => {});
ロダッシュ付き。通常、index
は必要ありませんが、場合によっては便利です。
私は今ラムダに移行しています:
R.map((item, index) => {}, items);
index
はundefined
です。確かに、上部スコープに変数index
を作成し、map
本体で毎回インクリメントすることができますが、FP Ramdaが表す観点からは少し間違っています。では、反復インデックスを取得するためのビルドはありますか?
チェックアウト addIndex
:
コールバック関数に2つの新しいパラメーター(現在のインデックスとリスト全体)を追加して、既存のリスト反復関数を作成します。
これにより、たとえば、Ramdaの単純なマップ関数が、Array.prototype.mapにより似たものに変わります。これは、反復コールバック関数が最初のパラメーターであり、リストが最後のパラメーターである関数に対してのみ機能することに注意してください。 (リストパラメーターが使用されていない場合、後者は重要ではない場合があります。)
ドキュメントの例:
var mapIndexed = R.addIndex(R.map);
mapIndexed((val, idx) => idx + '-' + val, ['f', 'o', 'o', 'b', 'a', 'r']);
//=> ['0-f', '1-o', '2-o', '3-b', '4-a', '5-r']
また、内部でR.addIndex
を使用する Ramda Adjunct から mapIndexed を使用することもできます。
Array.prototype.mapにより似ているR.map関数。コールバック関数には、現在のインデックスとリスト全体の2つの新しいパラメーターが必要です。
RA.mapIndexed((val, idx, list) => idx + '-' + val, ['f', 'o', 'o', 'b', 'a', 'r']);
//=> ['0-f', '1-o', '2-o', '3-b', '4-a', '5-r']
reduceIndexed も提供します
const initialList = ['f', 'o', 'o', 'b', 'a', 'r'];
reduceIndexed((acc, val, idx, list) => acc + '-' + val + idx, '', initialList);
//=> "-f0-o1-o2-b3-a4-r5"
addIndex
の代わりに、マッピングの前にtoPairs
を使用できます ドキュメント :
オブジェクトをキーと値の配列の配列に変換します。オブジェクト自体のプロパティのみが使用されます。出力配列の順序は、さまざまなJSプラットフォーム間で一貫しているとは限りません。
ドキュメントではオブジェクトについてのみ説明していますが、配列でも同様に機能します。あなたの例では:
R.map(([index, item]) => {}, R.toPairs(items));
// or, equivalent:
R.compose(
R.map(([index, item]) => {}),
R.toPairs,
)(items)
各インデックス/値のペアでは常にインデックスが最初の要素であるため、lodash(またはネイティブArray.prototype.map
)と比較して順序が逆になることに注意してください。