我经常发现自己编写这样的代码:
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
对象?
我知道我可以传入一个对象,但有时传递多个参数会更方便(例如与遗留代码集成,或者项目现有的编码风格)。
答案 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"}
适用于Chrome,Firefox和IE11,但我真的希望有更优雅的解决方案。如果Javscript支持反映参数名称,那将会很酷。
答案 2 :(得分:0)