簡體   English   中英

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

[英]Apply an object's properties to the arguments of a function

假設我有一個函數(可能來自第 3 方庫,假設我無法更改它的定義),以及一個具有與函數參數匹配或重疊的屬性的對象:

function fn(foo, bar, baz) { /* do stuff */ }
var obj = { foo: "yes", bar: 7, baz: false }

有沒有辦法使用某種解構或擴展賦值或其他一些 ES6 功能將對象屬性作為函數參數應用,或者我是否堅持單獨指定每個參數?

fn(...obj); // Doesn't work
fn(obj.foo, obj.bar, obj.baz); // Convoluted but works
fn.apply(null, obj.values()); // Might work if you're lucky

您可以為fn創建一個包裝函數:

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

然后你的電話簡化為:

myFn(obj);

這是一個丑陋的黑客,應該避免,但它確實有效(即使對象的值與參數的順序不同)。

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

您應該解構函數內部的鍵-對象對。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM