3 回答
TA贡献1836条经验 获得超5个赞
您可以为以下内容创建一个包装函数fn
:
const myFn = ({foo, bar, baz}) => fn(foo, bar, baz);
然后你的电话简化为:
myFn(obj);
TA贡献1824条经验 获得超6个赞
这是一个丑陋的 hack,应该避免,但它确实有效(即使对象的值与参数的顺序不同)。
const STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
const ARGUMENT_NAMES = /([^\s,]+)/g;
function getParamNames(func) {
const fnStr = func.toString().replace(STRIP_COMMENTS, '');
let result = fnStr.slice(fnStr.indexOf('(')+1, fnStr.indexOf(')')).match(ARGUMENT_NAMES);
if(result === null)
result = [];
return result;
}
function fn(foo, bar, baz) {
return {foo, bar, baz};
}
const obj = { foo: "yes", baz: false, bar: 7 };
const result = fn(...getParamNames(fn).map(name => obj[name]));
console.log(result);
注意:该函数的getParamNames
功劳归功于如何动态获取函数参数名称/值?
TA贡献2039条经验 获得超7个赞
您应该解构函数内的键对象对。
const fn = (opts) => {
const { foo, bar, baz } = opts; // Your function's "parameters"
console.log({ foo, bar, baz });
}
const obj = { PI: Math.PI, bar: 7, baz: false, foo: "yes" };
fn(obj);
天真的方法是使用扩展运算符(或 apply-null 技术)调用函数,但这并不能保证对象中的键值对与参数的预期顺序对齐。
function fn(foo, bar, baz) {
console.log(arguments);
}
const obj = { foo: "yes", bar: 7, baz: false };
fn(...Object.values(obj)); // or fn.apply(null, Object.values(obj))
添加回答
举报