У меня есть 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.Titleundefined, то он переходит ко второму оператору if. Но если value.Title[0]undefined, то это дает исключение во время выполнения. Почему он не переходит к третьему оператору if?
Исключение:
ERROR TypeError: Cannot read property '0' of undefined
Примечание: Я читаю здесь разные узлы. Он имеет разные свойства на каждом узле, например. У какого-то узла есть 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": "",
Как сделать это более разумным? @PranavCBalan
if (value.Title) { if (typeof value.Title === 'string') { caption = value.Title; return; } if (value.Title[0]) { caption = value.Title[0]; return; } }@PranavCBalan Это не то, что мне нужно. Пожалуйста, посмотрите мой пост еще раз
Вы комментируете каждому авсеру, что это не то, что вам нужно. Тогда вам следует уточнить, чего вы хотите.
Я сделал это. Пожалуйста, посмотрите это @Wendelin
Ваш вопрос: «Почему он не переходит к третьему оператору if?» Этот вопрос был задан несколько раз
Пожалуйста, прочитайте раздел Note. У меня нет ни Title, ни Title[0] на одном узле. Это было проблемой здесь. @Венделин
"19": { "класс": "FinalView", "Title": [ "Мой клуб" ], "Subtitle": "" } Если это ваш узел, чем value.Title == true, даже если это массив. Так что все ответы работают
@Wendelin Проблема на узле "18":.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Потому что 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.info(res)Это не то, что мне нужно. Пожалуйста, посмотрите мой пост еще раз.
@Sampath Обновил ответ
Как вы сказали, он генерирует исключение времени выполнения, когда значение. Название не определено. Выполнение скрипта останавливается после исключения времени выполнения, поэтому ваш третий оператор if никогда не оценивается.
Чтобы этого не произошло, вы можете переписать свой код следующим образом:
if (value.Title) {
caption = value.Title;
if (value.Title[0]) {
caption = value.Title[0];
}
return;
}
if (value.titleHTML5) { caption = value.titleHTML5; return; }
Это не то, что мне нужно. Пожалуйста, посмотрите мой пост еще раз
Ты уверен? Вы хотите найти заголовок в JSON. В этом случае мой код делает именно то, что вы хотите. Если это не то, что вы хотите сделать, вам следует обновить свой вопрос и сделать его более ясным.
Я обновил его. Мне нужно читать отдельные узлы с разными свойствами. Пожалуйста, посмотрите это.
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-го оператора, потому что остановится на первом, когда он определен, или вызовет исключение, если это так.
В любом случае вы кодируете неправильно.
Это не то, что мне нужно. Пожалуйста, посмотрите мой пост еще раз
ваше второе утверждение if не имеет никакого смысла