我曾经写过像
这样的东西_.map(items, (item, index) => {});
用lodash。通常我不需要index
,但有时它很有用。
我现在正在迁移到Ramda:
R.map((item, index) => {}, items);
index
是undefined
。当然,我可以在上部范围内创建变量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代表。那么获取迭代索引是否有任何构建方式?
答案 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
)相比,顺序是相反的。