【问题标题】:TypeError: Cannot read property '0' of undefined value.Title[0]类型错误:无法读取未定义值的属性“0”。标题 [0]
【发布时间】:2019-09-17 10:54:48
【问题描述】:

我有 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 语句?

例外:

错误类型错误:无法读取未定义的属性“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": "",

【问题讨论】:

  • 你的第二个 if 语句没有任何意义
  • 如何让它更有意义? @PranavCBalan
  • if (value.Title) { if(typeof value.Title === 'string') { caption = value.Title; return; } if (value.Title[0]) { caption = value.Title[0]; return; } }
  • @PranavCBalan 这不是我需要的。请再看我的帖子
  • 您对每个 awnser 都表示这不是您所需要的。然后你应该更清楚你想要什么

标签: javascript angular typescript


【解决方案1】:

因为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)

【讨论】:

  • 这不是我需要的。请再次查看我的帖子。
  • @Sampath 更新了答案
【解决方案2】:

正如您所说,当 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; }

【讨论】:

  • 这不是我需要的。请再看我的帖子
  • 你确定吗?您想在 JSON 中查找标题。在这种情况下,我的代码完全符合您的要求。如果这不是您想要做的,那么您应该更新您的问题并使其更清楚
  • 我已经更新了。我必须读取具有不同属性的不同节点。请看。
【解决方案3】:
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; }

【讨论】:

  • 这不是我需要的。请再看我的帖子
【解决方案4】:

如果不是未定义的标题将获取 value.Tittle 并且该方法将返回。如果它是未定义的,您将尝试读取未定义的第一个位置,这根本没有意义,当然会引发异常。这永远不会到达第三条语句,因为它会在定义时首先停止,否则会引发异常。

不管怎样,你的编码方式是错误的。

【讨论】:

  • 这不是我需要的。请再看我的帖子
猜你喜欢
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-08
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多