如何使用 ES6 Object spread 更新数组内的对象?

Posted

技术标签:

【中文标题】如何使用 ES6 Object spread 更新数组内的对象?【英文标题】:How to use ES6 Object spread to update object inside array? 【发布时间】:2019-07-13 01:55:37 【问题描述】:

我有以下来自响应的对象数组:

const baseInput = [
    PaymentRequirementsDetail:
     dateDue: '12/02/2019',
        outstandingMinimum:  Money:  amount: '5.20', code: 'GBP'  ,
        overlimit:  Money:  amount: '345.20', code: 'GBP'  ,
        arrears:  Money:  amount: '345.20', code: 'GBP'   
,
 Account: ,
    AccountId: '00000012345',
    CardBrand: 'SOMEBRAND',
    isAccountElibible: false,
    Customer:
     salutation: 'Mr',
        givenName: 'James',
        familyName: 'Jamesy',
        suffix: 'Dr' ,
    Delinquency:  monthsInArrears: 0, isOverlimit: true  ]

然后我用一堆函数转换响应,并返回一个友好的、格式化的上述版本。

const baseOutput = transform(baseInput);

这会返回:

       name: 'Mr James Jamesy, Dr',
        cardBrand: 'SOMEBRAND',
        isAccountElibible: false,
        delinquency:  monthsInArrears: 0, isOverlimit: true ,
        dateDue: '12/02/2019',
        outstandingMinimumAmount: 'GBP, 5.20',
        overlimitAmount: 'GBP, 345.20',
        arrearsAmount: 'GBP, 345.20' 

我现在想对此进行测试并生成一些快照。

我可以将上面的代码复制/粘贴到我的测试用例中,并在我做我的断言时更改值,这工作正常。像这样;

    test('should omit suffix if it is undefined', () => 
    const input = [
        PaymentRequirementsDetail:
         dateDue: '12/02/2019',
            outstandingMinimum:  Money:  amount: '5.20', code: 'GBP'  ,
            overlimit:  Money:  amount: '345.20', code: 'GBP'  ,
            arrears:  Money:  amount: '345.20', code: 'GBP'   
    ,
     Account: ,
        AccountId: '00000012345',
        CardBrand: 'SOMEBRAND',
        isAccountElibible: true,
        Customer:
         salutation: 'Mr',
            givenName: 'James',
            familyName: 'Jamesy' ,
        Delinquency:  monthsInArrears: 0, isOverlimit: true  ];

    const output = transform(input);

    expect(baseOutput).toMatchDiffSnapshot(output);
);

这将根据需要生成我的快照,我将能够清楚地看到带后缀的版本和没有后缀的版本之间的区别。

但是我相信有一种更简洁的方法可以使用对象扩展运算符来做到这一点。而不是上面的所有代码,我应该留下;

 const input = [
        ...baseInput,
        Customer:
         salutation: 'Mr',
        givenName: 'James',
        familyName: 'Jamesy'
        
    ];

但是,我无法以某种方式使用扩展运算符来实现这一点。谁能看到我的错误在哪里?

【问题讨论】:

你试过了吗? const input = [...baseInput] 然后运行 ​​.map 函数并匹配您要在其中输入客户数据对象的对象键。 因为 Customer 位于数组的第二个对象内,所以您必须用第二个对象包装它才能使其工作 【参考方案1】:

您的 baseInput 是一个包含两个项目的数组。扩展运算符适用于数组或对象,您在这里所做的是将数组扩展到目标对象中。

如果您的模型没有改变,您可以像这样简单地将索引对象传播到您的目标中:

const input = [
    ...baseInput[0]
  ,
        ...baseInput[1],
        Customer:
         salutation: 'Mr',
        givenName: 'James',
        familyName: 'Jamesy'
        
    ];

https://stackblitz.com/edit/typescript-imcqkh?file=index.ts

【讨论】:

以上是关于如何使用 ES6 Object spread 更新数组内的对象?的主要内容,如果未能解决你的问题,请参考以下文章

ES6扩展/收集运算符--spread/rest

ES6 spread元素 - 默认值

Es6之Spread Operater拷贝对象

在 Redux 中使用 Spread 运算符或 Object.assign 的权利是啥?

ES6数组扩展运算符(Rest+Spread)类方法原型方法

javascript ES6 Set和Spread Array Unique