Как правильно проверить, существует ли массив в JS?

Я получаю следующую ошибку, когда проверяю длину массива. Какой подход будет правильным?

main.js

if (drugPrice.mailPrice.rejectMessage.length !== 0 && Array.isArray(drugPrice.mailPrice.rejectMessage)) {
   //code goes here 
}

Ошибка

TypeError: Cannot read property 'length' of undefined

Снимите проверку длины. Сделанный.

qqilihq 29.05.2019 16:21

поменять местами чеки... if ( isArray && arr.length )... код выполняется в том порядке, в котором он читается. если нет массива, нет длины, поэтому ошибка.

Doug 29.05.2019 16:22

Массив может существовать, если длина === 0, а также

Nsevens 29.05.2019 16:22

иногда я получаю пустой массив, поэтому мне нужно проверить длину

hussain 29.05.2019 16:22
Поведение ключевого слова "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) для оценки ваших знаний,...
0
4
79
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Попробуйте поменять порядок проверок:

if (Array.isArray(drugPrice.mailPrice.rejectMessage) && drugPrice.mailPrice.rejectMessage.length !== 0) {
                                        code goes here 
}

Проверьте свои данные, замена условия может помочь, но не предотвратит возникновение некоторых ошибок. Например, Array.isArray(drugPrice.mailPrice.rejectMessage) выдаст ошибку, если drugPrice.mailPrice не определено.

if (drugPrice.mailPrice 
    && drugPrice.mailPrice.rejectMessage 
    && drugPrice.mailPrice.rejectMessage.length !== 0 
    && Array.isArray(drugPrice.mailPrice.rejectMessage)) {
  // code goes here 
}

var drugPrice = { mailPrice: { rejectMessage: {} } };

if (drugPrice.mailPrice 
    && drugPrice.mailPrice.rejectMessage 
    && drugPrice.mailPrice.rejectMessage.length !== 0 
    && Array.isArray(drugPrice.mailPrice.rejectMessage)) {

  console.info('success');
} else {
  console.info('fail')
}

ПРИМЕЧАНИЕ

Всегда проверяйте свои данные. Не думайте, что вы всегда будете получать правильные данные. При работе с объектами всегда проверяйте их, так как выполнение data.name может сломать ваше приложение, если data имеет значение null или не определено. например, для следующего объекта.

const drugPrice = { mailPrice: null };

делает, выдает ошибку.

const drugPrice = { mailPrice: null };

// throws an error, Cannot read property 'rejectMessage' of undefined
if (Array.isArray(drugPrice.mailPrice.rejectMessage)) {
}

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

const drugPrice = { mailPrice: null };
console.info(drugPrice.mailPrice && Array.isArray(drugPrice.mailPrice.rejectMessage) || 'Price is null or undefined')

Хотя вы делаете правильные выводы, это упускает фактическую проблему в исходном коде и, следовательно, неверно. Попробуйте -> var drugPrice = { mailPrice: { rejectMessage: {} } };

Reinstate Monica Cellio 29.05.2019 16:32

может я что-то упускаю jsbin.com/xabuwibavu/edit?js,консоль

Junius L. 29.05.2019 16:40

На самом деле извините - беру обратно. Я не понимаю, почему этот код не выдает ошибку в rejectMessage.length, если rejectMessage не является массивом (или строкой).

Reinstate Monica Cellio 29.05.2019 16:43

он не выдает, потому что rejectMessage существует и является объектом.

Junius L. 29.05.2019 16:44

Это предположение с моей стороны, вероятно, сформированное из моей привычки всегда ставить .isArray() перед проверкой длины. Я приношу извинения. Если отредактировать ваш ответ, я могу удалить свой неправильный отрицательный голос.

Reinstate Monica Cellio 29.05.2019 16:46

Все в порядке, я проверяю объекты, прежде чем что-либо с ними делать.

Junius L. 29.05.2019 16:48

Конечно. Просто мы делаем это по-разному и меня это сбило :)

Reinstate Monica Cellio 29.05.2019 16:49

Вам действительно не нужно на самом деле делать .length !== 0. Вы можете просто сделать:

if (Array.isArray(A.B.C) && A.B.C.length) {  // <-- order is important here
    //...
}

.length будет оцениваться как логическое значение, и это даст вам тот же результат, что и проверка с помощью !==0

При этом, однако, ваши пути довольно длинные, поэтому вы, вероятно, захотите убедиться, что они действительны. Это означает, что если drugPrice или mailPrice ложны, у вас возникнет проблема. Поэтому обычно вы также хотели бы проверить их. Поскольку ваш вопрос был о части массива, я пропущу их, но только для вашего сведения.

Вы можете создать свою собственную проверку пути или, если вы используете библиотеки, такие как lodash/underscore и т. д., у них всегда есть удобные функции get/has для проверки, как это (с lodash):

if (_.has(drugPrice, 'mailPrice.rejectMessage.length'))
    //...
}

Очевидно, не используйте эти библиотеки только для этого, но если они у вас уже есть, эти методы весьма удобны. Вы также можете просто проверить каждый из путей через:

if (A && A.B && Array.isArray(A.B.C) && A.B.C.length) {
    //...
}

Это просто становится утомительным, если у вас длинные пути к объектам и т. д.

Проблема в вашем коде заключается в том, что javascript проверяет длину массива, прежде чем проверять, является ли массив типом массива. Вы должны изменить порядок в операторе if.

Вы можете попробовать с:

if (myArr && Array.isArray(myArr) && myArr.length !== 0) {
    // your code
}

Теперь код выполняется в правильном порядке.

  1. Первое условие проверяет, определен ли myArr,
  2. Второе условие проверяет, является ли myArr типом Array, вы также можете сделать это так:

    если (myArr && myArr.push && myArr.length !== 0) { // ваш код }

  3. Третье условие проверяет, не является ли myArr пустым.

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