TypeError: Не удается прочитать свойство '0' неопределенного значения. Заголовок [0]

У меня есть 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": "",

ваше второе утверждение if не имеет никакого смысла

Pranav C Balan 28.04.2019 19:26

Как сделать это более разумным? @PranavCBalan

Sampath 28.04.2019 19:28
if (value.Title) { if (typeof value.Title === 'string') { caption = value.Title; return; } if (value.Title[0]) { caption = value.Title[0]; return; } }
Pranav C Balan 28.04.2019 19:29

@PranavCBalan Это не то, что мне нужно. Пожалуйста, посмотрите мой пост еще раз

Sampath 28.04.2019 19:36

Вы комментируете каждому авсеру, что это не то, что вам нужно. Тогда вам следует уточнить, чего вы хотите.

Wendelin 28.04.2019 19:43

Я сделал это. Пожалуйста, посмотрите это @Wendelin

Sampath 28.04.2019 19:44

Ваш вопрос: «Почему он не переходит к третьему оператору if?» Этот вопрос был задан несколько раз

Wendelin 28.04.2019 19:45

Пожалуйста, прочитайте раздел Note. У меня нет ни Title, ни Title[0] на одном узле. Это было проблемой здесь. @Венделин

Sampath 28.04.2019 19:47

"19": { "класс": "FinalView", "Title": [ "Мой клуб" ], "Subtitle": "" } Если это ваш узел, чем value.Title == true, даже если это массив. Так что все ответы работают

Wendelin 28.04.2019 19:51

@Wendelin Проблема на узле "18":.

Sampath 28.04.2019 19:56
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
10
95
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Потому что 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 28.04.2019 19:33

@Sampath Обновил ответ

lankovova 29.04.2019 12:17

Как вы сказали, он генерирует исключение времени выполнения, когда значение. Название не определено. Выполнение скрипта останавливается после исключения времени выполнения, поэтому ваш третий оператор if никогда не оценивается.

Чтобы этого не произошло, вы можете переписать свой код следующим образом:

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

Это не то, что мне нужно. Пожалуйста, посмотрите мой пост еще раз

Sampath 28.04.2019 19:34

Ты уверен? Вы хотите найти заголовок в JSON. В этом случае мой код делает именно то, что вы хотите. Если это не то, что вы хотите сделать, вам следует обновить свой вопрос и сделать его более ясным.

Wendelin 28.04.2019 19:40

Я обновил его. Мне нужно читать отдельные узлы с разными свойствами. Пожалуйста, посмотрите это.

Sampath 28.04.2019 19:42
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; }

Это не то, что мне нужно. Пожалуйста, посмотрите мой пост еще раз

Sampath 28.04.2019 19:34

Если это не неопределенный заголовок, он получит значение. Заголовок, и метод вернется. Если он не определен, вы попытаетесь прочитать первую позицию неопределенного, что не имеет никакого смысла и, конечно, вызовет исключение. Это никогда не достигнет 3-го оператора, потому что остановится на первом, когда он определен, или вызовет исключение, если это так.

В любом случае вы кодируете неправильно.

Это не то, что мне нужно. Пожалуйста, посмотрите мой пост еще раз

Sampath 28.04.2019 19:38

Другие вопросы по теме