亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將對象的屬性應用于函數的參數

將對象的屬性應用于函數的參數

達令說 2023-02-24 16:57:16
假設我有一個函數(可能來自第 3 方庫,假設我不能更改它的定義),以及一個具有與函數參數匹配或重疊的屬性的對象:function fn(foo, bar, baz) { /* do stuff */ }var obj = { foo: "yes", bar: 7, baz: false }有沒有一種方法可以使用某種解構或擴展分配或其他一些 ES6 功能將對象屬性應用為函數參數,或者我是否堅持單獨指定每個參數?fn(...obj); // Doesn't workfn(obj.foo, obj.bar, obj.baz); // Convoluted but worksfn.apply(null, obj.values()); // Might work if you're lucky
查看完整描述

3 回答

?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

您可以為以下內容創建一個包裝函數fn

const myFn = ({foo, bar, baz}) => fn(foo, bar, baz);

然后你的電話簡化為:

myFn(obj);


查看完整回答
反對 回復 2023-02-24
?
慕妹3242003

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功勞歸功于如何動態獲取函數參數名稱/值?


查看完整回答
反對 回復 2023-02-24
?
largeQ

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))


查看完整回答
反對 回復 2023-02-24
  • 3 回答
  • 0 關注
  • 144 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號