TypeError:无法读取未定义值的属性“ 0”。标题[0]

时间:2019-04-28 17:25:16

标签: javascript angular typescript

我有3条这样的语句:

  if (value.Title) { caption = value.Title; return; }
  if (value.Title[0]) { caption = value.Title[0]; return; }
  if (value.titleHTML5) { caption = value.titleHTML5; return; }

如果value.Title undefined,则转到第二个if语句。但是,如果value.Title[0] undefined,则会给出运行时异常。为什么它不转到if语句的第三位?

例外:

  

错误TypeError:无法读取未定义的属性“ 0”

注意::我在这里阅读不同的节点。像这样,它在每个节点上都有不同的属性。有些节点有Title,有些节点有Title[0],依此类推,即我在同一节点上没有TitleTitle[0]。这就是这里的问题。问题在18节点上。

"17": {
      "class": "ScrollView",
      "Title": "Guest Services",
      "Subtitle": "",
 "18": {
      "class": "Service",
      "title": "calendar",
      "imageHTML5": "",
      "titleHTML5": "Why you",
    },
"19": {
        "class": "FinalView",
        "Title": [
            "My Club"
          ],
        "Subtitle": "",

4 个答案:

答案 0 :(得分:3)

因为value.Title未定义,而您尝试这样做if (undefined[0]) {...}

将检查添加到您的if语句中,就像这样。

if (value.Title && value.Title[0]) { caption = value.Title[0]; return; }

更新

您可以使用object.hasOwnProperty()检查对象是否包含特定属性。然后,为了正确识别数组,建议您使用Array.isArray()方法。

使用下面提供的数据结构查看完整的工作示例。

const data = {
  "17": {
    "class": "ScrollView",
    "Title": "Guest Services",
    "Subtitle": "",
  },
  "18": {
    "class": "Service",
    "title": "calendar",
    "imageHTML5": "",
    "titleHTML5": "Why you",
  },
  "19": {
    "class": "FinalView",
    "Title": [
        "My Club"
      ],
    "Subtitle": "",
  },
  "20": {
    "class": "Foo",
    "Subtitle": "Bar",
  }
}

const res = Object.entries(data).reduce((acc, [ key, value ]) => {
  let caption = 'Default caption'
  
  if (value.hasOwnProperty('Title')) {
    caption = Array.isArray(value.Title) ? value.Title[0] : value.Title
  } else if (value.hasOwnProperty('titleHTML5')) {
    caption = value.titleHTML5
  }
  
  return {
    ...acc,
    [key]: caption,
  }
}, {})

console.log(res)

答案 1 :(得分:0)

如您所说,当未定义value.Title时,它将引发运行时异常。 在运行时异常后脚本的执行将停止,因此您的第三个if语句将永远不会得到评估。

为确保不会发生这种情况,您可以这样重写代码:

if (value.Title) { 
    caption = value.Title;
    if (value.Title[0]) { 
        caption = value.Title[0];
    }
    return;
}
if (value.titleHTML5) { caption = value.titleHTML5; return; }

答案 2 :(得分:0)

if (value.Title) { caption = value.Title; return; }

这意味着,如果该语句失败,则应运行下一个if,即

if (value.Title[0]) { caption = value.Title[0]; return; }

,但是请记住,如果到这一点,它的意思是value.title = undefined,但是您仍然尝试访问0处尚未定义的值的元素。解决方案是同时检查

if (value.Title && value.Title[0]) { caption = value.Title[0]; return; }

答案 3 :(得分:0)

如果不是undefined,标题将获得值。Tittle和方法将返回。如果未定义,则您将尝试读取undefined的第一个位置,这毫无意义,当然会引发异常。那永远不会到达第三条语句,因为它将在定义后首先停止,否则将引发异常。

无论如何,您的编码方式都是错误的。