Javascript — не может определить, содержит ли объект JSON true

#javascript #jquery #json #node.js

#javascript #jquery #json #node.js

Вопрос:

У меня есть объект JSON, который я извлекаю с сервера, иногда это действительно просто, например:

 { "urls": ["http://google.com", "http://bing.com"] }
  

Однако мне нужно проверить urls['tasks']['ipv6'] , содержит ли он true, код, который я использую:

 if (urls['tasks']['ipv6'] === true) {
  console.log('true');
}
  

Но поскольку urls [‘tasks’] не существует, я получаю следующую ошибку:

 Uncaught TypeError: Cannot read property 'ipv6' of undefined
  

Есть ли простой способ сделать это? Мне очень сложно найти решение в Интернете. Я также пробовал jQuery $.isEmptyObject и был бы доволен решением на основе jQuery. Для справки я фактически использую этот код в node.js .

Ответ №1:

Это должно помочь вам.

 if (urls["tasks"] amp;amp; urls["tasks"]["ipv6"] amp;amp; urls["tasks"]["ipv6"] === true)
{
    ...
}
  

Вы также можете добавить urls проверку слева, если вам нужно, и вы можете опустить среднюю проверку urls["tasks"]["ipv6"] , потому что, если это undefined так, это определенно не так true .

Дело в том, что вы должны сначала проверить, существуют ли свойства верхнего уровня, прежде чем переходить к детализации. И поскольку Javascript (как и большинство современных языков) не использует полную логическую эволюцию, это работает.

Комментарии:

1. Я думаю, что средний urls["tasks"]["ipv6"] тест не нужен. FWIW, то, что вы называете полной логической эволюцией , также называется оценкой короткого замыкания .

2. @FelixKling: Я отредактировал свой ответ, чтобы включить эту информацию. Спасибо.

3. @FelixKling: оценка короткого замыкания на самом деле противоположна другому термину, который использовался в качестве переключателя компилятора в Turbo Pascal много лет назад … 🙂 Но вы правы, это примерно та же парадигма.

4. Ах, хорошо, спасибо 🙂 Я знал только другой термин (и я знал, что на самом деле все наоборот). В любом случае, это ясно 🙂

5. @RobertKoritnik Большое спасибо, он отлично работает, я понятия не имел, что он будет так оцениваться.

Ответ №2:

 if (urls amp;amp; urls["tasks"] amp;amp; urls["tasks"]["ipv6"] === true) {
    console.log("true");
}
  

Ответ №3:

проверьте typeof перед проверкой на true или false…

 
if(typeof(urls['tasks']) != "undefined")
{
   if(typeof(urls['tasks']['ipv6']) != "undefined")  
   {
      if(urls['tasks']['ipv6'] === true)
      {
          console.log("I am true amp; I exist");
      }
   }
}
  

Комментарии:

1. немного подробный, но все же недопустимый… "undefined" должны быть литералы, а не строки… или используйте typeof оператор, который возвращает строки…