JavaScript函数参数:位置 - >映射转换

duc*_*cin 8 javascript syntax dictionary arguments function

我正在寻找一个vanilla JavaScript解决方案.

假设我有一个带有以下标题的函数:

generateEmail(firstName, lastname, provider)
Run Code Online (Sandbox Code Playgroud)

我需要像这样运行它:

generateEmail("John","Smith","gmail.com");
Run Code Online (Sandbox Code Playgroud)

我希望能够用参数映射而不是位置参数来调用它,即

generateEmail({
  "firstName":"John",
  "lastname": "Smith",
  "provider": "gmail.com"
});
Run Code Online (Sandbox Code Playgroud)

而且我正在寻找一个已经编写好的JavaScript解决方案,因为我有无限数量的函数,比如上面的generateEmail来处理.这样的图书馆存在吗?

我见过https://github.com/kilianc/node-introspect处理函数内省(返回函数抽象参数信息).但第二部分缺失 - 将map-call映射到位置调用.

请告诉我,这样的事情是否存在.


编辑:如果我没有说清楚:我不想修改原始的位置参数函数.我从外部提供程序获得这些函数,可以更新他的代码.我宁愿选择一个可以调用下面原始函数的包装器,并在外面提供一个map-argument API.

aps*_*ers 3

假设您可以访问introspectfrom node-introspect(它接受一个函数并返回参数名称的有序列表),您可以简单地执行以下操作:

function objArgsify(fn) {
    var argNames = introspect(fn);
    return function(obj) {
        return fn.apply(this,
                        argNames.map(function(a) { return obj[a]; });
    }
}
Run Code Online (Sandbox Code Playgroud)

通过以下方式调用它:

var generateEmailWithObjArgs = objArgsify(generateEmail);
generateEmailWithObjArgs({
  "firstName":"John",
  "lastname": "Smith",
  "provider": "gmail.com"
});
Run Code Online (Sandbox Code Playgroud)

它接受一个函数,读取其参数名称,然后返回一个包装函数,该函数接受一个对象并使用位置参数名称以正确的顺序从对象参数中提取属性。

该函数使用调用时对象参数作为映射将数组转换["firstName", "lastname", "provider"]为数组["John", "Smith", "gmail.com"]。然后使用该数组apply来调用位置参数函数。