var foo = function(a, b, c) {
console.log(a);
console.log(b);
console.log(c.id);
};
//this works obviously
foo("a man", "b man", {id: "c.id man"});
var par = {
a: "a val",
b: "b cal",
c: {
id: "c.id val"
}
};
//can I make this work automatically?
foo(par);
问题在于代码示例。
我可以自动"打开" par对象使用属性来填充函数参数?
javascript中是否有某种foo(par.unwrap())
?
答案 0 :(得分:4)
你可以,但鉴于对象属性是无序的,它有点hacky。解决方案是将函数解析为字符串以获取参数的名称。
这是一个效用函数:
function callunwrap(f,o){
f.apply(null, (f.toString().match(/\([^\)]*\)/)[0].match(/\w+/g)||[]).map(function(name){
return o[name];
}));
}
用法示例
var foo = function(a, b, c) {
console.log(a);
console.log(b);
console.log(c.id);
};
var par = {
a: "a val",
b: "b cal",
c: {
id: "c.id val"
}
};
callunwrap(foo, par);
现在,如你所见,callunwrap
做了很多事情,我不建议在真正的程序中使用这样一个hacky的东西。通常的非hacky解决方案是让您的函数显式读取参数:
var foo = function(o) {
console.log(o.a);
console.log(o.b);
console.log(o.c.id);
};
答案 1 :(得分:1)
你可以尝试
var parWorking = ["a val", "b cal", {
id: "c.id val"
}
];
foo.apply(this, parWorking);
答案 2 :(得分:0)
JavaScript参数名称可以是任意且不相关的,因此它不会过于重视它们。换句话说,您无法根据名称设置特定参数。更重要的是他们的指数。
如果您create an array out of the object's values,可以使用foo.apply()
将其传递到:
foo.apply(null /* the context */, parAsArray);
答案 3 :(得分:0)
自己很容易做到吗?
var args = [];
for(var p in par){
args.push(par[p]);
}
console.log(args); // ["a val", "b cal", Object { id="c.id val"}]
foo.apply(this, args);
答案 4 :(得分:0)
您可以为该Object创建upwrap()方法。
var foo = function(a,b,c) {
console.log(a);
console.log(b);
console.log(c.id);
};
var par = {
a: "a val",
b: "b cal",
c: {
id: "c.id val"
},
unwrap:function(){
var valueArray=[];
for(key in this){
if(typeof this[key]!=="function"){
valueArray.push(this[key]);
}
}
return valueArray;
}
};
foo("a man", "b man", {id: "c.id man"});
foo.apply(null,par.unwrap())
答案 5 :(得分:0)
如果使用ES-6参数解构,则可以这样做。这样做的方法是定义像
这样的函数function foo({a, b, c}) {
//here just use a, b, c as you want;
}
var par = {
a: "a val",
b: "b cal",
c : {
id: "c.id val"
}
};
foo(par);
您可以看到演示here