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條經驗 獲得超8個贊
您應該解構函數內的鍵對象對。
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))
添加回答
舉報