【问题标题】:How can I access iteration index in Ramda.map如何访问 Ramda.map 中的迭代索引
【发布时间】:2016-08-03 02:22:31
【问题描述】:

我曾经写过类似的东西

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

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

我现在正在迁移到 Ramda:

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

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

【问题讨论】:

  • 文档中有“另见”可以帮助您解决此类问题

标签: javascript mapping lodash ramda.js


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您还可以使用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"
    

    【讨论】:

      【解决方案3】:

      作为addIndex 的替代方案,您可以在映射之前使用toPairs,来自the documentation

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

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

      R.map(([index, item]) => {}, R.toPairs(items));
      
      // or, equivalent:
      
      R.compose(
          R.map(([index, item]) => {}),
          R.toPairs,
      )(items)
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-25
        • 2012-03-19
        • 2011-07-18
        • 1970-01-01
        • 2012-04-28
        • 2018-04-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多