如何在Ramda.map中访问迭代索引

32

我曾经写过类似于这样的内容

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

使用lodash库。通常情况下我不需要index,但有时它很有用。

现在我正在迁移到Ramda:

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

indexundefined。当然,我可以在上层作用域中创建变量index,并在map主体中每次递增,但从 Ramda 代表的函数式编程的角度来看,这种方法有点不正确。那么有没有内置的获取迭代索引的方法?


1
文档中有“参见”部分,可以帮助您解决此类问题。 - iofjuupasli
3个回答

52

查看addIndex

通过向回调函数添加两个新参数(当前索引和整个列表),从现有的列表迭代函数创建一个新的列表迭代函数。

例如,这将把 Ramda 的简单 map 函数转换成更接近 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']

3
你还可以使用 mapIndexed,它来自于 Ramda Adjunct,在内部使用了 R.addIndex

R.map函数更像是Array.prototype.map。它为回调函数提供了两个新参数:当前索引和整个列表。

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"

0
作为对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)相比,顺序被颠倒了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接