所以我有一些代码,我本质上是试图在一行中执行if、else if和else语句,但基于零性而非真性。
假设我有一个布尔值";"状态";在人对象上:
let person = {
status: true
}
我想显示基于以下条件的文本:
- 真:"已验证">
- 错误:"未验证">
- 不存在:'正在加载…'
我可以使用这样的三元运算符:
person?.status ? 'Verified' : 'Not Verified'
但是如果人对象不存在;"状态";字段不存在,它将返回一个伪值。
如果我使用这样的零合并运算符:
person?.status ?? 'Loading...'
我可以在非常精简和可读的代码中获得所需的结果,但如果不使用helper函数,就无法格式化文本。
有没有办法将这些代码组合成一行可读代码,或者我一直在写一个助手函数,或者使用一行更长的代码,比如
person?.status == null ? 'Loading...' : (person.status ? 'Verified' : 'Not Verified')
也许我很挑剔,但我只是想知道是否有人有一种更优化、更精简的方式来做到这一点。
谢谢你的帮助!
我只是想知道是否有人有一种更优化、更精简的方法来做到这一点。
这是倒退的。浓缩程度越高,可读性就越强。一行操作越多,就越难弄清楚它的作用:
a ?? b ? c ?? d?.e : f || x
这比不在一行中解析要困难得多。除其他事项外,您需要记住运算的顺序-OR是指(f || x)
,还是将整个表达式进行OR运算?
它将被解析为
(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',
}
}