JS:使用 find() 属性未定义的句柄

Posted

技术标签:

【中文标题】JS:使用 find() 属性未定义的句柄【英文标题】:JS: Handle with find() property undefined 【发布时间】:2019-02-22 16:16:09 【问题描述】:

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

但我想知道我是否遗漏了什么,这个功能可以用一句话来实现。

【问题讨论】:

如果你真的需要这个是一行,你可以使用(this.repInfo.find(el => el.id == tourId) || ).execs || []; 让内容多行可读并没有什么坏处...... 您好!谢谢@Titus,我完全忘记了statment >. 【参考方案1】:

怎么样

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 : [];

这次至少我跑了几次

【讨论】:

我不反对,但如果你愿意,我可以再给你一个。 答案是错误的....[id:'foo', execs:[]].find(el => 'execs' in el && el.id == 'bar' ).execs 还是会抛出同样的错误。【参考方案2】:

您似乎有一般的想法,Array.prototype.find 将在数组中搜索第一个元素,当用作回调的参数时,回调将返回一个真实值。如果没有找到,则返回undefined

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

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

如果Array.prototype.find 返回undefined,第一个内括号表达式将被评估为空对象,它可以尝试(并且失败)在没有TypeError 的情况下访问.execs 键,这也将评估为@ 987654328@,在这种情况下,函数返回空数组,这就是你上面的代码所做的。

编辑:已经有人评论了这个解决方案,大声笑,但正如 cmets 所说,保持多行并没有错(这样更具可读性)。

【讨论】:

您好!是的,之前有人回答过这个问题,但没有人解释过。非常感谢!

以上是关于JS:使用 find() 属性未定义的句柄的主要内容,如果未能解决你的问题,请参考以下文章

(Discord.js)TypeError:无法读取未定义的属性“添加”

确保未定义属性时 es6 find 不会中断 [重复]

使用 Node.js、Mongoose 和 Discord.js 的未定义错误 [无法读取未定义的属性]

为啥 find() 返回未定义?

为啥 find() 返回未定义?

js运行错误 无法获取未定义或 null 引用的属性“pagecount”