web-dev-qa-db-fra.com

Comment puis-je accéder à l'index d'itération dans Ramda.map

J'avais l'habitude d'écrire quelque chose comme

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

avec lodash. Habituellement, je n'ai pas besoin de index mais parfois c'est utile.

Je migre vers Ramda maintenant:

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

index est undefined. Bien sûr, je peux créer la variable index dans la portée supérieure et l'incrémenter à chaque fois dans le corps map mais c'est un peu faux de FP point de vue que Ramda représente Y a-t-il donc un moyen de construire un index d'itération?

30
Glen Swift

Découvrez addIndex :

Crée une nouvelle fonction d'itération de liste à partir d'une fonction existante en ajoutant deux nouveaux paramètres à sa fonction de rappel: l'index en cours et la liste entière.

Cela transformerait, par exemple, la fonction de carte simple de Ramda en une fonction qui ressemble davantage à Array.prototype.map. Notez que cela ne fonctionnera que pour les fonctions dans lesquelles la fonction de rappel d'itération est le premier paramètre et où la liste est le dernier paramètre. (Ce dernier peut être sans importance si le paramètre de liste n'est pas utilisé.)

Exemple de la documentation:

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

Vous pouvez également utiliser mapIndexed from Ramda Adjunct qui utilise R.addIndex sous la capuche.

Fonction R.map qui ressemble plus à Array.prototype.map. Il prend deux nouveaux paramètres pour sa fonction de rappel: l'index en cours et la liste entière.

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']

Il propose également un 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

Comme alternative à addIndex vous pouvez utiliser toPairs avant le mappage, depuis la documentation :

Convertit un objet en un tableau de tableaux de valeurs et de clés. Seules les propres propriétés de l'objet sont utilisées. Notez que l'ordre du tableau de sortie n'est pas garanti d'être cohérent sur différentes plates-formes JS.

La documentation ne parle que des objets mais elle fonctionne aussi bien avec les tableaux. Dans votre exemple:

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

// or, equivalent:

R.compose(
    R.map(([index, item]) => {}),
    R.toPairs,
)(items)

Gardez à l'esprit que dans chaque paire indice/valeur, l'indice est toujours le premier élément, donc l'ordre est inversé par rapport à lodash (ou le natif Array.prototype.map).

0
gabriele.genta