【问题标题】:How to apply the array of functions to array of corresponding arguments in Javascript?如何将函数数组应用于Javascript中的相应参数数组?
【发布时间】:2017-02-16 13:43:00
【问题描述】:

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

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

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    有几种方法可以做到这一点。我建议使用.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)

    【讨论】:

      【解决方案2】:

      我不知道它是否“优雅”,但你可以做到

      let results = functionArray.map((f, i) => f(arguments[i]))
      

      这会获取数组中的每个函数,找到关联的参数i,并使用该参数调用函数。

      【讨论】:

      • 嗯,我认为它很优雅,但后来我想出了一个相同的解决方案,所以我有偏见。 (抱歉,通常我会在意识到其他人先发布相同的内容后删除我的答案,但在这种情况下,我直到花时间添加工作演示后才注意到您的答案,所以我会给你留下一个改为投票。)
      • @nnnnnn 没问题!您的包括多种方法来完成它!
      【解决方案3】:

      如果您使用 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)));

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-25
        • 2016-12-04
        • 2020-02-24
        • 1970-01-01
        • 2018-08-27
        相关资源
        最近更新 更多