Javascript:将对象解压缩为函数参数

时间:2014-02-23 14:07:30

标签: javascript python

我在Javascript中有一个函数

function asd(foo, bar, baz) {
    // ...
}

这三个参数中的每一个都是必需的。

假设我将这些参数分组为对象:

var x = {
    foo: 10,
    bar: 20,
    baz: 30
};

我可以通过以某种方式“解压缩”对象asd来调用函数x吗?这可以一般地完成吗?即,不知道asd的签名。

我正在寻找类似于在Python中解包的kwargs:

def asd(foo, bar, baz):
    # ...

kwargs = {'foo': 10, 'bar': 20, 'baz': 30}
asd(**kwargs)

“不,不可能”的答案是可以接受的。我只想知道这是否可以在Javascript中使用。

4 个答案:

答案 0 :(得分:1)

function asd(foo, bar, baz) {
    console.log(foo, bar, baz);
}

var x = {
    foo: 10,
    bar: 20,
    baz: 30
};

var args = [];
for(var i in x){
    args.push(x[i]);
}
asd.apply(window, args);

但是,和其他人一样,订购是个问题。使用for,您可以按照定义的顺序获取属性。如果这就是您想要的,那么这个解决方案可以为您服务。但是不可能按名称映射参数。

答案 1 :(得分:1)

为像我这样来自Google的人们弄清楚事情:

否,这不可能在JavaScript中本身实现。

您必须实现一些自定义功能才能实现此目的(请参见其他答案)。

答案 2 :(得分:1)

这现在可以在 JavaScript 中实现。另一条评论说这在本地是不可能的是不正确的(并且不是在发布时)。它是在您提出问题大约一年后添加的 - 为多年后登陆这里的人们添加一个答案。

您的函数只需更改为:

function asd({foo, bar, baz}) {
    // ...
}

你这样称呼它:

var x = {
    foo: 10,
    bar: 20,
    baz: 30
};
asd(x);

MDN Destructuring Assignment

答案 3 :(得分:0)

回答到这篇旧文章后,我实现了依赖于spread运算符并解析函数参数名称的此解决方案。还可以改进以接受箭头功能。

Function.prototype.kwargs = function(argsObj){
  const rawArgs = this.toLocaleString().match(/\(.*\)\{/);
  if(!rawArgs){
    console.error("args parsing failed");
    return;
  }
  const argsList = rawArgs[0].replace(/\(|\)|\{/g, '').split(',');
  const args = argsList.map((param) => argsObj[param.trim()] || param);
  return this(...args);
}

function sum(a,b){
  return a+b;
}
const input = {a:1, b:2}
console.log(sum.kwargs({a:1, b:2}))


function sum2(a12,   b){
  return a12+b;
}
const input2 = {a12:1, b:2};
console.log(sum2.kwargs(input2));