我正在寻找一个 vanilla JavaScript 解决方案。
假设我有一个带有以下 header 的函数:
generateEmail(firstName, lastname, provider)
我需要像这样运行它:
generateEmail("John","Smith","gmail.com");
我希望能够使用参数映射而不是位置参数来调用它,即
generateEmail({
"firstName":"John",
"lastname": "Smith",
"provider": "gmail.com"
});
我正在寻找一个已经编写好的解决方案来用 JavaScript 执行此操作,因为我有无限数量的函数要处理,例如上面的 generateEmail。这样的图书馆存在吗?
我看过https://github.com/kilianc/node-introspect它处理函数自省(introspection)(返回函数抽象参数信息)。但是缺少第二部分 - 将 map-call 映射到 positional-call。
请告诉我,是否存在这样的事情。
编辑:如果我没有说清楚:我不想修改原来的位置参数函数。我从外部 vendor 那里获得了这样的功能,这可能会更新他的代码。我宁愿有一个包装器可以调用下面的原始函数,并在外部提供一个映射参数 API。
最佳答案
假设您可以从 node-introspect
访问 introspect
(它接受一个函数并返回一个有序的参数名称列表),你可以简单地做:
function objArgsify(fn) {
var argNames = introspect(fn);
return function(obj) {
return fn.apply(this,
argNames.map(function(a) { return obj[a]; });
}
}
调用方式:
var generateEmailWithObjArgs = objArgsify(generateEmail);
generateEmailWithObjArgs({
"firstName":"John",
"lastname": "Smith",
"provider": "gmail.com"
});
这接受一个函数,读取它的参数名称,然后返回一个包装函数,该函数接受一个对象并使用位置参数名称以正确的顺序从对象参数中提取属性。
此函数使用调用时对象参数作为映射,将数组 ["firstName", "lastname", "provider"]
转换为数组 ["John", "史密斯", "gmail.com"]
。然后将该数组与 apply
一起使用以调用位置参数函数。
关于JavaScript 函数参数 : positional -> map transition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30030161/