我曾经写过类似于这样的内容
_.map(items, (item, index) => {});
使用lodash库。通常情况下我不需要index
,但有时它很有用。
现在我正在迁移到Ramda:
R.map((item, index) => {}, items);
index
是 undefined
。当然,我可以在上层作用域中创建变量index
,并在map
主体中每次递增,但从 Ramda 代表的函数式编程的角度来看,这种方法有点不正确。那么有没有内置的获取迭代索引的方法?
我曾经写过类似于这样的内容
_.map(items, (item, index) => {});
使用lodash库。通常情况下我不需要index
,但有时它很有用。
现在我正在迁移到Ramda:
R.map((item, index) => {}, items);
index
是 undefined
。当然,我可以在上层作用域中创建变量index
,并在map
主体中每次递增,但从 Ramda 代表的函数式编程的角度来看,这种方法有点不正确。那么有没有内置的获取迭代索引的方法?
查看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']
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']
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)
Array.prototype.map
)相比,顺序被颠倒了。