Как мне отформатировать ответ, если ключ объекта существует?

#javascript #node.js #ecmascript-6

#javascript #node.js #ecmascript-6

Вопрос:

Описание

Я получил ответ, возвращающийся от службы, которую я вызываю на серверной части моего узла.

Затем я преобразую свой ответ в более удобный формат, например;

 export default (response) => {
const {
    limit,
    debt,
    outstanding
} = response.object;

const transformedData = {
    outstanding: retrieveAmounts(outstanding),
    limit: retrieveAmounts(limit),
    debt: retrieveAmounts(debt)
};
return _omitBy(transformedData, value => value === null);
};
  

Как вы можете видеть, я запускаю функцию retrieveAmounts(value) для каждого элемента.

 const retrieveAmounts = ({ amount, code }) => ({
amount: isStringDefined(amount) ? amount : null,
currencyCode: isStringDefined(code) ? code : null
});
  

Обновить

retrieveAmounts() в свою очередь вызывает isDefinedString , который проверяет указанный тип и длину, вот так;

 const isDefinedString = value => typeof value === 'string' amp;amp; value.length > 0;
  

Проблема в том, что в то время как оба; долг и лимит обязательны и всегда будут возвращаться — непогашенный не является. Если нечего отображать, ключа объекта там просто не будет.
Это когда retrieveAmounts() выдается ошибка, потому что она не может fin amount или code из undefined — поскольку они не существуют, потому что ключа там нет.

Как я могу отформатировать ключ объекта, если он существует, но вернуть null, если он не существует? Таким образом, retrieveAmounts() не будет выдаваться ошибка, и я просто предоставлю ее limit:null своему интерфейсному приложению.

Ответ №1:

‘undefined’ не может быть деструктурирован. Вам нужно проверить, не определено ли оно перед деструктурированием.

 let limit = {'amount': '1000', 'code': '£'}, outstanding = undefined, debt = {'amount': '900', 'code': '£'};

const retrieveAmounts = amountStruct => {
    if (typeof amountStruct === 'undefined') 
        return null;
    let {amount, code} = amountStruct;
     return {
        amount: isStringDefined(amount) ? amount : null,
        currencyCode: isStringDefined(code) ? code : null
    };
};
  

Встроенный в соответствии с кодом @alex35.

 const retrieveAmounts = (amountStruct) => ((typeof amountStruct === 'undefined') ? null : {
    amount: isStringDefined(amountStruct.amount) ? amountStruct.amount : null,
    currencyCode: isStringDefined(amountStruct.code) ? amountStruct.code : null
});
  

Комментарии:

1. У меня возникают проблемы с передачей правил сложности в моем linter. Есть ли где-нибудь еще, куда мы можем вставить эту неопределенную проверку? Попробовал функцию — ломается

Ответ №2:

Вы могли бы поместить параметр по умолчанию внутри вашей retrieveAmounts функции, поэтому указание undefined внутри вашей функции retrieveAmounts не приведет к ошибке.

 const retrieveAmounts = (outstanding = { amount: null, code: null }) => ({  // << here
    amount: isStringDefined(outstanding.amount) ? amount : null,
    currencyCode: isStringDefined(outstanding.code) ? code : null
});
  

Комментарии:

1. Это не работает:-( для этого требуется количество и код за пределами области видимости, и я получаю ReferenceError: amount is not defined

2. Я обновил его с помощью outstanding.amount и outstanding.code . Если параметр не определен, я получаю {amount: null, currencyCode: null} .

3. Я не принял ваш ответ, поскольку приведенный выше ответ допускает возврат limit как null, где значения по умолчанию здесь возвращают объект вместе с их свойствами. хотя 1 за полезный ввод