Как использовать ES6 Object распространения для обновления объекта внутри массива? - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть следующий массив объектов, который получается из ответа:

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'
        }
    }];

Однако я не могу использовать оператор распространения таким образом, чтобы достичь этого.Кто-нибудь может увидеть, где моя ошибка?

1 Ответ

0 голосов
/ 19 февраля 2019

Ваш baseInput - массив с двумя элементами.Оператор распространения работает как с массивами, так и с объектами, и здесь вы распространяете массив в целевой объект.

Если ваша модель не изменяется, вы можете просто распределить индексированный объект по вашей цели следующим образом:

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

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

...