web-dev-qa-db-ja.com

Ramda.mapの反復インデックスにアクセスするにはどうすればよいですか

昔は

_.map(items, (item, index) => {});

ロダッシュ付き。通常、indexは必要ありませんが、場合によっては便利です。

私は今ラムダに移行しています:

R.map((item, index) => {}, items);

indexundefinedです。確かに、上部スコープに変数indexを作成し、map本体で毎回インクリメントすることができますが、FP Ramdaが表す観点からは少し間違っています。では、反復インデックスを取得するためのビルドはありますか?

30
Glen Swift

チェックアウト 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']
40
andyk

また、内部で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"
2
Undistraction

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)と比較して順序が逆になることに注意してください。

0
gabriele.genta