javascript - JS:使用 find() 属性未定义的句柄
问题描述
我有一个从数组中的元素返回值的方法。并非所有元素都具有我想要返回的属性。我想使用该方法用一行来执行此功能find()
。我试过这种方法来解决它:
getExecsFromTour(tourId){
return this.repInfo.find(el => el.id == tourId ).execs || [];
}
但是不包含该属性的元素会execs
返回错误undefined
。
为了解决这个问题,我不得不将结果存储在一个局部变量中:
getExecsFromTour(tourId){
let items = this.repInfo.find(el => el.id == tourId);
return items != undefined ? items.execs : [];
}
但是我想知道我是否遗漏了什么,这个功能可以用一句话来实现。
解决方案
您似乎有一般的想法,Array.prototype.find
将在数组中搜索第一个元素,当用作回调的参数时,回调将返回一个真实值。如果没有找到,则返回undefined
。
您的代码应该可以工作,但是是的,在一行中执行此操作的一种方法(如果您愿意)是使用:
getExecsFromTour(tourId){
return (this.repInfo.find(el => el.id == tourId) || {}).execs || [];
}
如果Array.prototype.find
返回undefined
,第一个内部括号表达式将被评估为空对象,它可以尝试(并且失败)访问.execs
没有 a 的键TypeError
,这也将评估为undefined
,在这种情况下,函数返回空数组,这就是你上面的代码做。
编辑:有人已经评论了这个解决方案,大声笑,但正如评论所说,保持多行没有错(这样更具可读性)。
推荐阅读
- javascript - Javascript - 修改数组中的日期对象
- ios - AVKit 与 Swift 一起使用,但没有创建文件。为什么?
- javascript - 加载页面后添加什么事件监听器来执行一段代码?
- c# - 在 Unity 中,当我的正方形与圆形碰撞时,我想摧毁它
- reactjs - 在对象数组上反应 setState
- javascript - 模板字符串不适用于 AJAX 请求中的链接?
- c# - 不使用 LINQ 的 C# 中的 Delete() 和 Update() 函数
- ios - 如何连续关闭,然后为覆盖在同一视图上的多个面板视图打开一个新面板(如果一开始是活动的)?
- arrays - 根据两个值阈值过滤列
- javascript - 如何在javascript中查找数组中重复出现的次数最多的项目