javascript - Javascript 运算符 - 将 Nullish Coalescing 与三元相结合
问题描述
所以我有一些代码,我基本上试图在一行中执行 if、else if、else 语句,但基于无效性而不是真实性。
假设我在一个人对象上有一个布尔值“状态”:
let person = {
status: true
}
我想根据以下条件显示文本:
- 真:“已验证”
- 错误:'未验证'
- 不存在:“正在加载...”
我可以像这样使用三元运算符:
person?.status ? 'Verified' : 'Not Verified'
但是如果 person 对象不存在,或者“status”字段不存在,它将返回一个错误值。
如果我像这样使用空值合并运算符:
person?.status ?? 'Loading...'
我可以通过非常简洁易读的代码获得所需的结果,但是如果不使用辅助函数,就无法格式化文本。
有没有办法将它们组合成一行可读的代码,或者我是否坚持编写一个辅助函数或使用更长的代码行,如下所示:
person?.status == null ? 'Loading...' : (person.status ? 'Verified' : 'Not Verified')
也许我很挑剔,但我只是想知道那里是否有人有更优化、更简洁的方式来做到这一点。
谢谢你的帮助!
解决方案
我只是想知道那里是否有人有更优化、更简洁的方式来做到这一点。
你有这个倒退。更凝练并不更具可读性。一行中的操作越多,就越难弄清楚它的作用:
a ?? b ? c ?? d?.e : f || x
比不是全部在一行中更难在心理上解析。除其他事项外,您需要记住操作的顺序 - OR 是指(f || x)
还是 OR-ing 整个表达式到那里?
它将被解决为
(a ?? b ? c ?? d?.e : f) || x
. 然而,在你的脑海中评估这一点几乎没有帮助。
写这个的更优化和可读的方式是使用常规if
/else
语句
let status;
if (person?.status == null)
status = 'Loading...';
else if (person.status)
status = 'Verified';
else
status = 'Not Verified';
如果需要,可以将其封装在一个函数中。
function status(person) {
if (person?.status == null)
return 'Loading...';
if (person.status)
return 'Verified';
return 'Not Verified';
}
如果你真的需要一些简短的东西,你可以有一个简单的查找表来解析不同的可能值:
const lookup = {
"null" : 'Loading...',
"true" : 'Verified',
"false": 'Not Verified',
}
/* ... */
const status = lookup[person?.status ?? null];
也可能:删除空值合并运算符并undefined
在查找中编码:
const lookup = {
"null" : 'Loading...',
"undefined" : 'Loading...',
"true" : 'Verified',
"false" : 'Not Verified',
}
/* ... */
const status = lookup[person?.status];
这大多无关紧要,但有些有趣。您可以结合查找和函数来创建一个相当小的函数,该函数不使用if
/else
或switch
-es 来确定要返回的内容:
const status = person => ({
"null" : 'Loading...',
"undefined" : 'Loading...',
"true" : 'Verified',
"false" : 'Not Verified',
})[person?.status];
console.log( status() ); //Loading...
console.log( status(null) ); //Loading...
console.log( status({}) ); //Loading...
console.log( status({status: true}) ); //Verified
console.log( status({status: false}) ); //Not Verified
这不是最佳实践,但偶尔会派上用场。它可以帮助制作原型。例如,从函数中提取对象是一个简单的重构,这反过来又允许您从配置中加载它。在这种情况下,如果您有类似的东西,它可能有助于将其翻译成不同的语言
{
'english': {
"null" : 'Loading...',
"undefined" : 'Loading...',
"true" : 'Verified',
"false" : 'Not Verified',
},
'pig-lating': {
"null" : 'Oadinglay...',
"undefined" : 'Oadinglay...',
"true" : 'Erifiedvay',
"false" : 'Otnay Erifiedvay',
}
}
推荐阅读
- tensorflow.js - 如何从本地磁盘加载 bodypix 模型?
- javascript - 用于社交分享的 Vue 应用程序元标记
- rust - 如何在 Rust 中基于 ' 进行拆分
- rust - 类似结构的 rust 代码重复数据删除
- php - 如何在 Opencart 树枝中包含页眉和页脚
- sql-server - 如何使用在一个表中链接外键和主键的水晶报表制作报表
- java - 使用反射将字符串转换为枚举值,其中枚举类型可以是多个
- r - 将 NA 替换为变量均值的函数
- android - Andoid:在 TabLayout 中处理数据变化
- javascript - Javascript 承诺和错误处理 - try/catch