JS:处理find()属性未定义

时间:2018-09-18 15:14:15

标签: javascript typescript find ecmascript-2017

我有一个方法,它从数组中的一个元素返回一个值。并非所有元素都具有我要返回的属性。我想使用方法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 : [];
}

但是我想知道我是否缺少什么,并且可以用一句话来实现此功能。

2 个答案:

答案 0 :(得分:1)

您似乎有一个大致的想法,Array.prototype.find将在数组中搜索第一个元素,该元素在用作回调的参数时将使回调返回真实值。如果未找到任何内容,则返回undefined

您的代码应该可以工作,但是可以,在一行中(如果需要)执行此操作的一种方法是使用:

getExecsFromTour(tourId){
  return (this.repInfo.find(el => el.id == tourId) || {}).execs || [];
}

如果Array.prototype.find返回undefined,则第一个内部括号表达式将被评估为空对象,该对象可能会尝试(并且失败)在没有{{1}的情况下访问.execs键},其结果也将为TypeError,在这种情况下,该函数将返回空数组,这就是您上面的代码所做的。

编辑:有人已经评论了该解决方案,哈哈,但是正如评论所说,将其保持为多行并没有错(这样更易读)。

答案 1 :(得分:0)

关于

getExecsFromTour(tourId){
     return this.repInfo.find(el => 'execs' in el && el.id == tourId ).execs || [];
}

...

编辑

var a = [{execs : 1, id:4}, {id:5}];
function getExecsFromTour(tourId, x){
    return (x = a.find(el => 'execs' in el && el.id == tourId )) ? x.execs : [];
}

这次至少我跑了几次