我在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中使用。
答案 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);
答案 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));