例如,我有一系列函数:
[func1, func2, func3, func4]
和参数数组[arg1, arg2, arg3, arg4]
。我需要将func1应用于arg1,将func2应用于arg2等。
最好的方法是什么?当然,我可以使用简单的循环来浏览元素,但也许存在更优雅的方式。
答案 0 :(得分:4)
有几种方法可以做到这一点。我建议使用.map()
method来迭代函数,因为这样你就可以轻松地将它们的返回值放到另一个数组中:
const results = funcs.map((f, i) => f(args[i]))
在上下文中:
const funcs = [
(a) => a * 2,
(a) => a * 3,
(a) => a * 4,
(a) => a * 5
]
const args = [1, 2, 3, 4]
const results = funcs.map((f, i) => f(args[i]))
console.log(results)
答案 1 :(得分:3)
我不知道它是否“优雅”,但你可以做到
let results = functionArray.map((f, i) => f(arguments[i]))
这将获取数组中的每个函数,找到关联的参数i
,并使用该参数调用该函数。
答案 2 :(得分:1)
如果你使用像Lodash这样的库,你可以使用_.zipWith
,它同时迭代几个数组,并使用数组的元素调用提供的函数。
const results = _.zipWith(funcs, args, (f, a) => f(a));
如果您想在不导入库的情况下简单实现zipWith
,请使用:
const zipWith = (...arrays) => {
const func = arrays.pop();
return arrays[0].map((_, i) => func(...arrays.map(arr => arr[i])));
};
const zipWith = (...arrays) => {
const func = arrays.pop();
return arrays[0].map((_, i) => func(...arrays.map(arr => arr[i])));
};
const funcs = [
a => a * 2,
a => a * 3,
a => a * 4,
a => a * 5
];
const args = [1, 2, 3, 4];
console.log(zipWith(funcs, args, (f, a) => f(a)));