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

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

您可以在传递的参数上使用 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

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

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

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

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

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

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

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

详情见Replace apply()