Как правильно проверить, существует ли массив в JS? - PullRequest
0 голосов
/ 29 мая 2019

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

main.js

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

Ошибка

TypeError: Cannot read property 'length' of undefined

Ответы [ 4 ]

4 голосов
/ 29 мая 2019

Попробуйте поменять местами чеки:

if (Array.isArray(drugPrice.mailPrice.rejectMessage) && drugPrice.mailPrice.rejectMessage.length !== 0) {
                                        code goes here 
}
1 голос
/ 29 мая 2019

Проверьте ваши данные, замена условия может помочь, но это не предотвратит некоторые ошибки. Например, 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.log('success');
} else {
  console.log('fail')
}

Примечание

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

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.log(drugPrice.mailPrice && Array.isArray(drugPrice.mailPrice.rejectMessage) || 'Price is null or undefined')
0 голосов
/ 29 мая 2019

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

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

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

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

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

    if (myArr && myArr.push && myArr.length! == 0) { // ваш код }

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

0 голосов
/ 29 мая 2019

Вам на самом деле не нужно делать .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) {
    //...
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...