从函数参数生成对象

Build object from function parameters

本文关键字:对象 参数 函数      更新时间:2024-05-29

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

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对象?

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

我会使用javascript中的arguments对象来实现这一点。每个函数都有一个参数数组,可以按如下方式枚举。

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

基于@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支持对参数名称进行反射,那就太酷了。

ES2015简写对象文字减少了一些重复:

function handleSomeEvent(a, b, c) {
  console.log({ a, b, c })
}