我有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]
,依此类推,即我在同一节点上没有Title
和Title[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": "",
答案 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的第一个位置,这毫无意义,当然会引发异常。那永远不会到达第三条语句,因为它将在定义后首先停止,否则将引发异常。
无论如何,您的编码方式都是错误的。