【问题标题】:Transform an array into a comma separated variables WITHOUT apply将数组转换为逗号分隔的变量而不应用
【发布时间】:2015-04-24 16:27:03
【问题描述】:

我正在尝试重新实施申请练习。我想出了一个天真的解决方案,通过在对象上临时装饰该函数然后将其删除来在对象的上下文中执行函数。但是当我调用它时,我无法弄清楚如何传递 fn 逗号分隔的参数,因为它们是数组形式。

如何在不应用、调用或绑定的情况下将数组转换为逗号分隔的变量?

function apply(fn, context, args) {
  context.fn = fn;
  var result = context.fn();
  delete context.fn;
  return result;
}

function add(a,b) {
  return a + b + this.num;
}

console.log(apply(add, {num: 10}, [3, 4])); //17

编辑:

我不希望我的值被拆分成一个字符串。我希望我的值分成comma separated form。这本质上就是 apply 在您将数组传递给它时所做的事情。

【问题讨论】:

  • 使用连接? join(',') 还是我真的误会了这个问题?
  • 抱歉,这里有误会。我不想要一个字符串。我希望我的值用逗号分隔符 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 好吧,你没有说不要使用eval,所以你可以在join生成的字符串上使用eval,但一般情况下最好避免使用。但是,您的用例听起来像是一种特殊情况,因为您正在重新创建一个内置函数。
  • @forgivenson 是的,我认为你可能是对的。似乎实现这一点的唯一方法是使用 eval()。谢谢!
  • nvm,我试过了,eval 会返回逗号运算符的结果,所以在你的例子中它返回4

标签: javascript


【解决方案1】:

尝试以下方法:

[1,2,3,4,5].join(",")

【讨论】:

  • 嘿,我想我没有正确传达我的问题。我刚刚更新了我的问题
【解决方案2】:

您可以在 ES6 中借助 spread operator

console.log(...myArray);

在撰写本文时,FF37 和 TraceurBabel 等转译器支持此功能。

另一种方法是通过currying the function 并循环传递参数。大致如下:

myArray.forEach(curriedConsoleLog);

也就是说,我认为仅使用 apply 并没有什么坏处。

【讨论】:

    【解决方案3】:

    由于您的函数只能接收两个参数,这将起作用:

    function apply(fn, context, args) {
      context.fn = fn;
      var result = context.fn(args[0],args[1]);
      delete context.fn;
      return result;
    }
    
    function add(a,b) {
      return a + b + this.num;
    }
    
    console.log(apply(add, {num: 10}, [3, 4]));
    

    【讨论】:

    • 这只是演示预期输入和输出的示例。我需要一个更通用的解决方案。
    【解决方案4】:
    function apply(fn, context, args) {
        context.fn = fn;
        while (args.length) {
            context.fn = context.fn(args.shift());
        }
        return context.fn;
    }
    
    function cubus(a) {
        return function (b) {
            return function (c) {
                return a * b * c / this.num;
            }
        }
    }
    
    function add(a) {
        return function (b) {
            return a + b + this.num;
        }
    }
    
    document.write(apply(add, { num: 10 }, [3, 4]));
    document.write('<br>');
    document.write(apply(cubus, { num: 10 }, [3, 4, 5]));
    

    看看What is 'Currying'?

    【讨论】:

      猜你喜欢
      • 2018-05-27
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多