#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 за полезный ввод