为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

达令说 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条经验 获得超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))


查看完整回答
反对 回复 2023-02-24
  • 3 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信