检查JS中是否存在数组的正确方法是什么?

时间:2019-05-29 14:20:40

标签: javascript arrays ecmascript-6

当我检查数组的长度时,出现以下错误。正确的方法是什么?

main.js

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

错误

TypeError: Cannot read property 'length' of undefined

4 个答案:

答案 0 :(得分:4)

尝试交换支票的顺序:

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

答案 1 :(得分:1)

验证数据,交换条件可能会有所帮助,但不能阻止某些错误的发生。例如,如果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为null或未定义,则在使用对象时总是要像对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')

答案 2 :(得分:0)

您实际上并不需要真正执行.length !== 0。您可以简单地做到:

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

.length将被评估为布尔值,其结果与使用!==0进行检查的结果相同

话虽这么说,但是您的路径很长,因此您可能希望确保它们有效。意思是如果drugPricemailPrice为假,那么您将遇到问题。因此,通常您也希望对其进行检查。由于您的问题是关于数组部分的,因此我将跳过这些部分,但就像仅供参考。

您可以构建自己的路径检查器,或者使用诸如lodash / underscore之类的库,它们总是具有方便的get/has函数来进行这样的检查(使用lodash):

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

很显然,不只是为了这些而使用这些库,但是如果您已经拥有它们,那么这些方法将非常方便。您也可以通过以下方法简单地检查每个路径:

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

如果对象路径等很长,这将变得很乏味。

答案 3 :(得分:0)

您的代码中的问题是javascript在检查数组是否为数组类型之前先检查数组长度。您应该在if语句中更改顺序。

您可以尝试:

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

现在,代码以正确的顺序执行。

  1. 第一个条件检查是否定义了myArr,
  2. 第二个条件检查myArr是否为数组类型,您也可以这样做:

    if(myArr && myArr.push && myArr.length!== 0){      //您的代码 }

  3. 第三个条件检查myArr是否不为空。