有没有可以在数组上使用的安全导航运算符之类的东西?

Posted

技术标签:

【中文标题】有没有可以在数组上使用的安全导航运算符之类的东西?【英文标题】:Is there something like a Safe Navigation Operator that can be used on Arrays? 【发布时间】:2017-11-22 14:47:33 【问题描述】:

我使用 Safe Navigation Operator for Objects 来加载异步调用,这非常棒。我以为我可以为 Arrays 重现相同的内容,但它在我的 Angular 代码中显示模板解析错误。我知道*ngIf 是一种替代解决方案,但有没有更简单(通过代码)的方式,就像安全导航运算符一样?

<div class="mock">
   <h5>data?.title</h5>  //This works
   <h6>data?.body</h6>  //This works
   <h6>simpleData?[0]</h6>  // This is what I tried to implement    
</div>

【问题讨论】:

是的,javascript 和 TypeScript 将此称为 Optional Chaining 运算符,它确实适用于数组。请参阅此页面上的 my answer 以及 this question。 【参考方案1】:

有没有更简单(通过代码)的方式,就像 Safe Navigation Operator 一样?

有ternary operator。

条件? expr1 : expr2

<h6>simpleData?simpleData[0]:''</h6>   

【讨论】:

这是我一定忽略的。它起作用了:D 当您拥有相当复杂的深度数据时,这往往会变得非常难以阅读:((a?.b||[])[13]?.c||[])[7] 而不是现代 ECMAscript 中的 a?.b?.[13]?.c?.[7] 虽然不完全是 Angular 特定的,但您也可以使用 lodash 安全地检索更深层嵌套的对象。例如get myData() return _.get(this.thing, 'a[0].b.c'); lodash.com/docs/4.17.15#get【参考方案2】:

当然这是个人喜好问题,但在这种情况下,我倾向于使用更短的方法:

<h6>(simpleData || [])[0]</h6>

【讨论】:

但它是空数组,所以访问第一个元素无论如何都会失败? 不,不会的。读取不存在的元素会返回undefined,Angular 会将其转换为空结果。 有些人可能会考虑使用Nullish Coalescing operator (??) 现在被认为是一种更好的做法:(simpleData ?? [])[0]。也就是说,现在可用的Optional Chaining operator (?.) 为所述问题提供了更直接的解决方案。【参考方案3】:

其他答案是相同的,但我发现foo &amp;&amp; foo[0] 是最易读的。如果左侧是假的,则不会评估逻辑与运算符的右侧,因此您可以安全地获得 undefined(或者我猜是 null,如果您不相信 Douglas Crockford。)具有最少的额外字符.

就此而言,您要求“更简单”的解决方案,但实际上*ngIf 对于您提供的用例可能是正确的。如果您在此处使用任何答案,您将得到一个不需要的空 h6 标签。如果您将标签本身设置为有条件的,您只需将foo[0] 放在把手中,并确信当foo 仍未定义时它不会被评估,而且您永远不会用空标签污染页面。

【讨论】:

【参考方案4】:

是否有类似安全导航运算符的东西可以在数组上使用?

是的,您正在寻找的就是可选链接运算符 (JavaScript / TypeScript)。

MDN JavaScript 文档中显示的语法是:

obj.val?.prop
obj.val?.[expr]
obj.arr?.[index]
obj.func?.(args)

所以,要实现你想要的,你需要改变你的例子:

<h6>simpleData?[0]</h6>

收件人:

<h6>simpleData?.[0]</h6>
                 ^

另见How to use optional chaining with array in Typescript?。

【讨论】:

对于任何人来说这是最新的,这也可以用于组件逻辑。

以上是关于有没有可以在数组上使用的安全导航运算符之类的东西?的主要内容,如果未能解决你的问题,请参考以下文章

Groovy 中的安全导航运算符

在 Laravel 中使用诸如 JSON 函数之类的 Postgres 功能

在 MSVC 中有 MFC 自定义控件(设计时)之类的东西,有没有 win32 自定义控件之类的东西?

如何将Unicode字符存储在数组中?

mapxtreme如何加载在线地图如高德,谷歌之类的

有没有像 Windows 的 xvfb 或 xnest 之类的东西? [关闭]