从函数参数构建对象

时间:2013-12-09 20:26:11

标签: javascript

我经常发现自己编写这样的代码:

function handleSomeEvent(p1, p2, p3) {
  var data =  { p1: p1, p2: p2, p3: p3 };

  //Or any other function that takes an object
  $.ajax('/url', { data: data, ... });
}

有没有办法可以根据我的函数参数自动构建data对象?

我知道我可以传入一个对象,但有时传递多个参数会更方便(例如与遗留代码集成,或者项目现有的编码风格)。

3 个答案:

答案 0 :(得分:0)

我在javascript中使用arguments对象来做这件事。每个函数都有一个arguments数组,可以枚举如下。

var data = {};
for(var i=0; i<arguments.length; i++) {
   data["var" + i] = arguments[i];
}

答案 1 :(得分:0)

根据@HaukurHaf的链接,我将它拉到一起(使用Underscore.js):

var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
function getParamMap(func, funcArgs) {
  var fnStr = func.toString().replace(STRIP_COMMENTS, '')
  var names = fnStr.slice(fnStr.indexOf('(')+1, fnStr.indexOf(')')).match(/([^\s,]+)/g)
  if(names === null)
     names = []
  args = Array.prototype.slice.call(funcArgs);
  return _.object(_.zip(names, args));
}

function example(a, b, c, d) {
    return getParamMap(example, arguments);
}

console.log(example(1,2,3, "hello"));
// -> Object {a: 1, b: 2, c: 3, d: "hello"} 

http://jsfiddle.net/rGtu7/2

适用于Chrome,Firefox和IE11,但我真的希望有更优雅的解决方案。如果Javscript支持反映参数名称,那将会很酷。

答案 2 :(得分:0)

ES2015 shorthand object literals reduce some of the repetition: function handleSomeEvent(a, b, c) { console.log({ a, b, c }) }