如何将对象作为方法输入参数而不是参数数组传播?

How to spread object as method input parameter but not as arguments array?

我有一个需要乘法参数的函数和一个包含与参数字段名称具有相同键名的信息的输入对象,举一个小例子,例如

const input = {
   firstName: 'first',
   lastName: 'last',
   age: 19
}

function test(firstName, lastName, age, otherThings) {
   console.log('firstName: ', firstName):
   console.log('lastName: ', lastName):
   console.log('age: ', age):
}

现在我必须通过我的输入对象的 dot 符号来调用它,或者使用变成数组的传播然后在那里使用索引

// call method 1
test(input.firstName, input.lastName, input.age, 'other');

// call method - I know it's kinda ugly but just an available way
test(...[input][0], ...[input][1], ...[input][2], 'other');

我想知道是否有任何其他方法可以使用 spread operator 的想法,但不是映射到数组中,而是将对象传播为 flatMap 然后自动将它们映射到方法参数中字段,我知道 ...input 可能不起作用,因为 input 是一个对象而不是数组,所以它不可迭代。

// is it possible?
test(...input.someAction?, 'other');

当我的输入对象非常大并且想找出一种不修改方法签名的智能执行方式时,这会有所帮助,请注意我不能修改方法签名或实现,我们可以将其视为一个接口方法,我们只能确定如何在我们这边执行它

const input = {
   firstName: 'first',
   lastName: 'last',
   age: 19
}

function test(firstName, lastName, age, otherThings) {
   console.log('firstName: ', firstName);
   console.log('lastName: ', lastName);
   console.log('age: ', age);
}

test.apply(this, Object.values(input));

您可以使用 apply 发送值。但是,不能保证对象键顺序,因此这不是一个“很好”的解决方案。

test(...Object.values(input), 'other')

会有点用,但当然,一旦对象获得更多属性或以不同的顺序包含它们,它就会中断 - 它不会将属性放入相应参数名称的参数中,这是不可能的。为了获得正确的解决方案,您应该更改 test 函数以获取选项对象:

function test(options) {
   console.log('firstName: ', options.firstName):
   console.log('lastName: ', options.lastName):
   console.log('age: ', options.age):
}

或解构:

function test({firstName, lastName, age, otherThings}) {
   console.log('firstName: ', firstName):
   console.log('lastName: ', lastName):
   console.log('age: ', age):
}

然后你可以使用

正确调用它
test(input)

或者还有对象传播

test({...input, otherThings: 'other'})