Есть что-то вроде быстрой опциональной цепочки в javascript?
Мне очень нравится код в javascript
if (params && params.profile && params.profile.address && params.profile.address.default)
где я должен проверять каждый вариант, он становится довольно утомительным. Есть ли лучший способ в javascript, похожий на то, как swift будет иметь дело с опциями, например.
if let checked = params?.profile?.address?.default?
Ответы
Ответ 1
В native JS такого оператора нет.
Тем не менее, есть плагин Babel, который выполнит это, пожалуйста, проверьте https://github.com/davidyaha/ecmascript-optionals-proposal
Кроме того, обратитесь к Нулевой доступ к свойствам (и условному назначению) в ES6/2015 для получения дополнительных ссылок
Ответ 2
Я написал функцию, которая обрабатывает это, в качестве альтернативы ответу YangMinYuan:
function getSafe (func) {
try {
return func()
} catch (e) {
if (e instanceof TypeError) {
return undefined
} else {
throw e
}
}
}
Назовите это так:
if (getSafe(() => params.profile.address.default))
Это работает, потому что, оборачивая его в анонимную функцию, он не обрабатывается до блока try/catch, который затем перехватит ошибку и вернет undefined
, если какое-либо из родительских свойств не определено.
Проверка того, является ли e
TypeError
, предотвращает его проглатывание любых других ошибок, которые может выдать функция, чтобы они по-прежнему могли обрабатываться по мере необходимости. Если вы хотите, чтобы он просто возвращал undefined
при любой ошибке, вы можете удалить эту часть:
function getSafeNoErrors (func) {
try {
return func()
} catch {
return undefined
}
}
Ответ 3
function optionalChaining(obj, chain) {
return chain
.split('.')
.reduce(function(acc, val) {
return acc ? acc[val] : undefined;
}, obj);
}
var user = {
address: {
street: 'No.969 West WenYi Road',
},
a: { b: { c: 2 } },
}
optionalChaining(user, 'address.street'); // 'No.969 West WenYi Road'
optionalChaining(user, 'a.b.c') // 2
Функция может имитировать необязательную цепочку.
Ответ 4
Просто добавьте к ответу выше, теперь вы можете установить этот плагин babel прямо из NPM:
https://www.npmjs.com/package/babel-plugin-transform-optional-chaining
obj?.prop // optional static property access
obj?.[expr] // optional dynamic property access
func?.(...args) // optional function or method call
Примечание:
Чтобы позволить foo?.3: 0 быть проанализированным как foo?.3: 0 (как требуется для обратной совместимости), на уровне лексической грамматики добавлена простая "заглядывание", так что последовательность символов?. в этой ситуации не интерпретируется как один токен (за символом?. не должно быть сразу после десятичной цифры).
https://github.com/tc39/proposal-optional-chaining
Также стоит проверить:
https://github.com/tc39/proposal-nullish-coalescing
https://github.com/babel/babel/tree/master/packages/babel-plugin-proposal-nullish-coalescing-operator