猿问

将对象的属性应用于函数的参数

假设我有一个函数(可能来自第 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


达令说
浏览 116回答 3
3回答

一只甜甜圈

您可以为以下内容创建一个包装函数fn:const myFn = ({foo, bar, baz}) => fn(foo, bar, baz);然后你的电话简化为:myFn(obj);

慕妹3242003

这是一个丑陋的 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功劳归功于如何动态获取函数参数名称/值?

largeQ

您应该解构函数内的键对象对。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))
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答