繁体   English   中英

如何将对象作为参数传播到函数?

[英]how to spread an object to a function as arguments?

我有一个对象是一个接受参数的函数,我想传播这些对象,因此每个属性都是该函数中的一个参数。

我的代码做错了什么?

const args = {
    a: 1
    b: 2
}

const fn = (a, b) => a + b

// i am trying with no success
console.log(fn(...args))

尽管其他答案是正确的,但它们更改了函数签名以接受一个对象而不是 2 个单独的参数。 下面是如何在不改变函数签名的情况下使用对象的值作为函数参数。 这需要Object.values (ES 2017) 和扩展运算符在您的运行时可用。

const args = {
  a: 1,
  b: 2
}

const fn = (a, b) => a + b

fn(...Object.values(args));

请记住,这仅适用于您的特定情况,因为Object.values返回所有对象键的值并且不保证按字母顺序排序。 如果您只想获取名为ab的属性值,您可以映射Object.keys(args)并仅过滤这些值。

您可以对传递的参数使用 ES6 object destructuring ,然后只传递您的对象。

 const args = {a: 1, b: 2} const fn = ({a, b}) => a + b console.log(fn(args))

您还可以为这些属性设置默认值。

 const args = {b: 2} const fn = ({a = 0, b = 0}) => a + b console.log(fn(args))

你需要这样做

const fn = ({a, b}) => a + b

其他答案当然适用于特定情况,但也有一些局限性。 因此,我想提出一种不同的方法。 这个想法是向对象添加一个方法,该方法以适当的顺序返回所需参数的数组。 该方法在作为参数传递给目标函数时执行,结果使用扩展运算符进行解构。

const args = {
    a: 1,
    b: 2,
    argumentify: function () { 
        return [this.a, this.b]; 
    }
};

const fn = (a, b) => a + b;

console.log(fn(...args.argumentify()));

这种方法的好处:

1) 不需要更改目标函数的签名,因此可以用于任何函数。

2)保证参数的正确顺序(在传播对象时(据我所知)不能保证)。

3) 如果需要,可以对其本身进行参数化。

将 args 转换为数组应该可以工作:

const args = [1, 2]
const fn = (a, b) => a + b
console.log(fn(...args))

有关详细信息,请参阅替换 apply()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM