Javascript运算符-将Nullish合并与三元运算符相结合



所以我有一些代码,我本质上是试图在一行中执行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/elseswitch-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',
}
}

相关内容

  • 没有找到相关文章

最新更新