假设我有一个iteratee函数,它接受一个项目并返回一个项目,例如用于map
,each
函数等。
愚蠢的例子:
function nameConverter(item) {
return {
fullName: item.firstName + ' ' + item.lastName;
}
}
如果我有一个函数接受回调或对某个项目有承诺,那么直接传递nameConverter
函数很容易:
return getPerson().then(nameConverter);
然而,我经常发现自己处于这样一种情况:我需要一个带有列表的函数,它使用所述iteratee函数迭代列表。当然,每次创建单行函数非常简单:
return listPersons().then(function(persons) {
return persons.map(nameConverter);
});
当经常这样做时,让我感到困扰的是没有更短的语法,所以我创建了一个辅助函数:
function mapper(iteratee) {
return function(list) {
return _.map(list, iteratee);
}
}
允许我做
return listPersons().then(mapper(nameConverter));
然后我进一步将其概括为:
function iterator(iterate, iteratee) {
return function(list) {
return iterate(list, iteratee);
}
}
这样我就可以为map
,each
,filter
或任何下划线/ lodash函数做同样的事情:
return listPersons().then(iterator(_.map, nameConverter));
然而,我很好奇是否有更好的方法,这样的标准Javascript函数或者下划线/ lodash中的东西已经做了同样的事情?这似乎是一种常见的情况...
答案 0 :(得分:1)
for( auto p : morseCode )
函数实际上正在执行lodash的partialRight函数,即将最右边的参数部分应用于函数。
因此,在上面的示例中,iterator
代替了_.partialRight
:
iterator
注意我在问题中添加的评论错误地使用了curryRight,其中应该是partialRight。 return listPersons().then(_.partialRight(_.map, nameConverter));
类似但返回一个函数,其中参数在第一个curried函数后应用:
curryRight
或(丑陋的)
let curriedConverter = _.curryRight(_.map);
curriedConverter(nameConverter)
因此迭代器替换变为
let curriedConverter = _.curryRight(_.map)(nameConverter);