如何在Javascript中将函数数组应用于相应参数的数组?

时间:2017-02-16 04:46:56

标签: javascript arrays

例如,我有一系列函数: [func1, func2, func3, func4]和参数数组[arg1, arg2, arg3, arg4]。我需要将func1应用于arg1,将func2应用于arg2等。

最好的方法是什么?当然,我可以使用简单的循环来浏览元素,但也许存在更优雅的方式。

3 个答案:

答案 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)));