Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I access iteration index in Ramda.map

I used to write something like

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

with lodash. Usually I don't need index but sometimes it's useful.

I'm migrating to Ramda now:

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

index is undefined. Sure, I can create variable index in upper scope and increment it every time in map body but it's kinda wrong from FP point of view that Ramda stands for. So is there's any build in way of getting iteration index?

like image 803
Glen Swift Avatar asked Apr 12 '16 12:04

Glen Swift


People also ask

What is compose in Ramda?

compose Function Performs right-to-left function composition. The rightmost function may have any arity; the remaining functions must be unary.

What is JavaScript ramda?

Ramda is a library of functions designed to make functional programming in JavaScript easy and powerful without making it any less like JavaScript.

Why should I use ramda?

What makes Ramda great is that their functions are automatically curried, which allows us to quickly build up sequences of small and straightforward functions or old functions that we already have created.


2 Answers

Check out addIndex:

Creates a new list iteration function from an existing one by adding two new parameters to its callback function: the current index, and the entire list.

This would turn, for instance, Ramda's simple map function into one that more closely resembles Array.prototype.map. Note that this will only work for functions in which the iteration callback function is the first parameter, and where the list is the last parameter. (This latter might be unimportant if the list parameter is not used.)

Example from the docs:

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']
like image 122
andyk Avatar answered Oct 04 '22 01:10

andyk


You can also use mapIndexed from Ramda Adjunct which uses R.addIndex under the hood.

R.map function that more closely resembles Array.prototype.map. It takes two new parameters to its callback function: the current index, and the entire list.

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

It also offsers a reduceIndexed

const initialList = ['f', 'o', 'o', 'b', 'a', 'r'];

reduceIndexed((acc, val, idx, list) => acc + '-' + val + idx, '', initialList);
//=> "-f0-o1-o2-b3-a4-r5"
like image 36
Undistraction Avatar answered Oct 04 '22 03:10

Undistraction