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

时间:2016-04-12 12:50:05

标签: javascript mapping lodash ramda.js

我曾经写过像

这样的东西
_.map(items, (item, index) => {});

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

我现在正在迁移到Ramda:

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

indexundefined。当然,我可以在上部范围内创建变量index,并且每次在map身体中增加变量public class DocuSignAuthenticator implements ClientRequestFilter { private String user; private String password; private String integatorKey; private String sendBehalfOf; public DocuSignAuthenticator(String username, String password, String integatorKey, String sendBehalfOf) { this.username = username; this.password = password; this.integatorKey = integatorKey; this.sendBehalfOf = sendBehalfOf; } @Override public void filter(ClientRequestContext requestContext) throws IOException { requestContext.getHeaders().add( "X-DocuSign-Authentication", getAuthenticationHeader()); } private String getAuthenticationHeader() { StringBuilder builder = new StringBuilder(); builder.append("<DocuSignCredentials>"); builder.append("<SendOnBehalfOf>"); builder.append(sendBehalfOf); builder.append("</SendOnBehalfOf>"); builder.append("<Username>"); builder.append(username); builder.append("</Username>"); builder.append("<Password>"); builder.append(password); builder.append("</Password>"); builder.append("<IntegratorKey>"); builder.append(integatorKey); builder.append("</IntegratorKey>"); builder.append("</DocuSignCredentials>"); return builder.toString(); } } 但从FP的角度来看它有点错误,Ramda代表。那么获取迭代索引是否有任何构建方式?

3 个答案:

答案 0 :(得分:40)

结帐addIndex

  

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

     

例如,这会将Ramda的简单映射函数转换为更接近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']

答案 1 :(得分:2)

您还可以使用mapIndexed内的Ramda Adjunct reduceIndexed

  

R.map函数更接近于Array.prototype.map。它的回调函数需要两个新参数:当前索引和整个列表。

R.addIndex

它还激活{{3}}

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

答案 2 :(得分:0)

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

  

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

文档仅讨论对象,但与数组同样有效。在您的示例中:

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

// or, equivalent:

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

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