使用对象作为函数参数

时间:2014-11-18 09:19:26

标签: javascript

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())

http://plnkr.co/edit/Y5M3qq7ROfaGGXrU21G5?p=preview

6 个答案:

答案 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);

http://jsfiddle.net/9fzg3ehu/

答案 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())

Updated plunker

答案 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