为啥我在这个 for 循环中无法读取未定义的属性“startsWith”?

Posted

技术标签:

【中文标题】为啥我在这个 for 循环中无法读取未定义的属性“startsWith”?【英文标题】:Why am I getting Cannot read property 'startsWith' of undefined in this for loop?为什么我在这个 for 循环中无法读取未定义的属性“startsWith”? 【发布时间】:2019-11-02 16:21:21 【问题描述】:

我正在尝试按“版本”对数组进行排序,然后识别所有以“iPad”开头的字符串。

以下代码不记录任何内容并返回错误。

orderedUsers: function () 
  let newarray = sortBy(this.jobs, 'version').reverse()
  for (let i in newarray) 
    if (i.version.startsWith('iPad')) 
      console.log(i.version);
    
  
  return newarray

错误:

TypeError: Cannot read property 'startsWith' of undefined

如果我删除 for 循环并放入:

orderedUsers: function () 
  let newarray = sortBy(this.jobs, 'version').reverse()
  return newarray

列表按版本正确排序。这让我觉得这个错误与我编写 for 循环或 if 语句的方式有关。

我在这里做错了什么。

【问题讨论】:

什么是this.jobs for..in 用于迭代对象。循环中的i 是数组中的索引。索引没有版本属性。见developer.mozilla.org/en-US/docs/Web/javascript/Reference/… 我想我已经在回答你最后一个问题时提到了这一点:***.com/questions/56674240/… why am i getting 'i is not defined' error from a simple for loop in vue.js component script?的可能重复 相关:***.com/a/29397769/621962 【参考方案1】:

for...in 构造并没有按照您的想法进行操作。它旨在迭代对象。所以在这种情况下,它将newArray 视为一个对象,但将属性名称作为数组索引。 Javascript 中的数组只是具有数字属性名称的对象。更具体地说,如果您将代码更改为:

for (let i in newarray) 
    if (i.version.startsWith('iPad')) 
      console.log(i);
    
  

您会清楚地看到问题所在。 i 是一个数字,而不是一个作业对象。

【讨论】:

你为什么将for...in 链接到一本关于 Rust 的书? 这是一个错误。现在修好了。不过你的速度很快! 谢谢@Choc13 :)【参考方案2】:

修复:

orderedUsers: function () 
  let newarray = sortBy(this.jobs, 'version').reverse()
  for (let i in newarray) 
    if (newarray[i].version.startsWith('iPad')) 
      console.log(newarray[i].version);
    
  
  return newarray

【讨论】:

您真的应该将 Jack 的答案标记为正确,而不是再次发布他的解决方案。 我使用了 amy 的初始评论来修复 - 但如果这是同一件事,我会将千斤顶标记为正确

以上是关于为啥我在这个 for 循环中无法读取未定义的属性“startsWith”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在 React 中得到“无法读取未定义的属性(读取 'map')”,而没有语法错误

对于循环和矩阵迭代问题:TypeError:无法读取未定义的属性“0”

无法在 vue.js 中读取“未定义”的属性

为啥我会收到“未捕获的类型错误:无法读取未定义的属性 'body'”?

为啥“渲染中的错误:TypeError:无法读取未定义的属性'过滤器'”返回甚至已经可用的数据?

为啥这些 Jest 测试失败了? TypeError:无法读取未定义的属性“应用”