为什么在此for循环中无法读取未定义的属性“ startsWith”?

时间:2019-06-19 21:14:59

标签: javascript arrays object vue.js ecmascript-6

我试图按'version'对数组进行排序,然后识别所有以'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语句的方式有关。

我在做什么错了。

2 个答案:

答案 0 :(得分:-1)

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

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

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

答案 1 :(得分:-1)

修复:

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