获取将迭代函数应用于列表的 javascript 函数的最佳方法?
Best way to get a javascript function that applies an iteratee function to a list?
假设我有一个迭代函数,它接受一个项目和 returns 一个项目,例如用于 map
、each
函数等
愚蠢的例子:
function nameConverter(item) {
return {
fullName: item.firstName + ' ' + item.lastName;
}
}
如果我有一个函数接受回调或对某个项目有承诺,直接传递 nameConverter
函数很容易:
return getPerson().then(nameConverter);
但是,我经常发现自己还需要一个函数获取一个列表,该函数使用所述迭代函数遍历列表。为此每次创建一个单行函数当然很简单:
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
或任何 underscore/lodash 函数做同样的事情:
return listPersons().then(iterator(_.map, nameConverter));
但是,我很好奇是否有更好的方法,例如标准 Javascript 函数或 underscore/lodash 中已经有的东西可以做同样的事情?这似乎是一个常见的情况...
iterator
函数有效地完成了 lodash 的 partialRight 函数所做的事情,即部分地将最右边的参数应用于函数。
所以在上面的例子中,_.partialRight
是 iterator
的替代品:
return listPersons().then(_.partialRight(_.map, nameConverter));
注意我在问题中添加的评论错误地使用了 curryRight 而它应该是 partialRight。 curryRight
类似,但 returns 一个函数,其中参数在函数首次柯里化后应用:
let curriedConverter = _.curryRight(_.map);
curriedConverter(nameConverter)
或(更丑的)
let curriedConverter = _.curryRight(_.map)(nameConverter);
所以迭代器替换就变成了
return listPersons().then(_.curryRight(_.map)(nameConverter))); // yuk
假设我有一个迭代函数,它接受一个项目和 returns 一个项目,例如用于 map
、each
函数等
愚蠢的例子:
function nameConverter(item) {
return {
fullName: item.firstName + ' ' + item.lastName;
}
}
如果我有一个函数接受回调或对某个项目有承诺,直接传递 nameConverter
函数很容易:
return getPerson().then(nameConverter);
但是,我经常发现自己还需要一个函数获取一个列表,该函数使用所述迭代函数遍历列表。为此每次创建一个单行函数当然很简单:
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
或任何 underscore/lodash 函数做同样的事情:
return listPersons().then(iterator(_.map, nameConverter));
但是,我很好奇是否有更好的方法,例如标准 Javascript 函数或 underscore/lodash 中已经有的东西可以做同样的事情?这似乎是一个常见的情况...
iterator
函数有效地完成了 lodash 的 partialRight 函数所做的事情,即部分地将最右边的参数应用于函数。
所以在上面的例子中,_.partialRight
是 iterator
的替代品:
return listPersons().then(_.partialRight(_.map, nameConverter));
注意我在问题中添加的评论错误地使用了 curryRight 而它应该是 partialRight。 curryRight
类似,但 returns 一个函数,其中参数在函数首次柯里化后应用:
let curriedConverter = _.curryRight(_.map);
curriedConverter(nameConverter)
或(更丑的)
let curriedConverter = _.curryRight(_.map)(nameConverter);
所以迭代器替换就变成了
return listPersons().then(_.curryRight(_.map)(nameConverter))); // yuk