获取将iteratee函数应用于列表的javascript函数的最佳方法是什么?

时间:2017-01-20 08:00:52

标签: javascript underscore.js lodash

假设我有一个iteratee函数,它接受一个项目并返回一个项目,例如用于mapeach函数等。

愚蠢的例子:

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);
    }
}

这样我就可以为mapeachfilter或任何下划线/ lodash函数做同样的事情:

return listPersons().then(iterator(_.map, nameConverter));

然而,我很好奇是否有更好的方法,这样的标准Javascript函数或者下划线/ lodash中的东西已经做了同样的事情?这似乎是一种常见的情况...

1 个答案:

答案 0 :(得分:1)

for( auto p : morseCode )函数实际上正在执行lodash的partialRight函数,即将最右边的参数部分应用于函数。

因此,在上面的示例中,iterator代替了_.partialRight

iterator

注意我在问题中添加的评论错误地使用了curryRight,其中应该是partialRightreturn listPersons().then(_.partialRight(_.map, nameConverter)); 类似但返回一个函数,其中参数在第一个curried函数后应用:

curryRight

或(丑陋的)

let curriedConverter = _.curryRight(_.map);
curriedConverter(nameConverter)

因此迭代器替换变为

let curriedConverter = _.curryRight(_.map)(nameConverter);