31

我曾经写过类似的东西

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

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

我现在正在迁移到 Ramda:

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

indexundefined。当然,我可以index在上层范围内创建变量并每次在map正文中递增它,但从 Ramda 所代表的 FP 的角度来看,这有点错误。那么是否有任何构建方式来获取迭代索引?

4

3 回答 3

50

签出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']
于 2016-04-12T12:57:23.323 回答
3

您还可以使用Ramda Adjunct的 mapIndexed ,它在后台使用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"
于 2018-04-11T08:54:54.423 回答
0

作为addIndex您可以toPairs在映射之前使用的替代方法,来自文档

将对象转换为键、值数组的数组。仅使用对象自身的属性。请注意,不保证输出数组的顺序在不同的 JS 平台上是一致的。

该文档仅讨论对象,但它同样适用于数组。在您的示例中:

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

// or, equivalent:

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

请记住,在每个索引/值对中,索引始终是第一个元素,因此与 lodash (或 native Array.prototype.map)相比,顺序是相反的。

于 2019-10-24T21:00:03.607 回答