繁体   English   中英

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

[英]How can I access iteration index in Ramda.map

我曾经写过类似的东西

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

与lodash。 通常我不需要index但有时它很有用。

我现在要迁移到Ramda:

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

index undefined 当然,我可以在上限范围内创建变量index ,并每次在map主体中对其进行递增,但是从FP的角度来看,Ramda代表的观点有点不对。 那么获取迭代索引是否有任何方法?

查看addIndex

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

例如,这会将Ramda的简单map函数变成一个更类似于Array.prototype.map的函数。 请注意,这仅适用于以迭代回调函数为第一个参数且列表为最后一个参数的函数。 (如果不使用list参数,则后者可能并不重要。)

来自文档的示例:

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

您还可以使用Ramda Adjunct中的R.addIndex ,该引擎在R.addIndex使用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"

作为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 )相比,顺序是相反的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM