【发布时间】:2017-02-16 13:43:00
【问题描述】:
例如,我有一个函数数组:
[func1, func2, func3, func4] 和参数数组 [arg1, arg2, arg3, arg4]。我需要将 func1 应用于 arg1,将 func2 应用于 arg2 等。
最好的方法是什么?当然,我可以使用简单的循环来遍历元素,但也许存在更优雅的方式。
【问题讨论】:
标签: javascript arrays
例如,我有一个函数数组:
[func1, func2, func3, func4] 和参数数组 [arg1, arg2, arg3, arg4]。我需要将 func1 应用于 arg1,将 func2 应用于 arg2 等。
最好的方法是什么?当然,我可以使用简单的循环来遍历元素,但也许存在更优雅的方式。
【问题讨论】:
标签: javascript arrays
有几种方法可以做到这一点。我建议使用.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)
【讨论】:
我不知道它是否“优雅”,但你可以做到
let results = functionArray.map((f, i) => f(arguments[i]))
这会获取数组中的每个函数,找到关联的参数i,并使用该参数调用函数。
【讨论】:
如果您使用 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)));
【讨论】: