开发者问题收集

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

2019-05-29
97

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

main.js

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

错误

TypeError: Cannot read property 'length' of undefined
3个回答

尝试交换检查的顺序:

if (Array.isArray(drugPrice.mailPrice.rejectMessage) && drugPrice.mailPrice.rejectMessage.length !== 0) {
                                        code goes here 
}
Todd Chaffee
2019-05-29

验证您的数据,交换条件可能会有所帮助,但无法防止某些错误发生。例如,如果 drugPrice.mailPrice 未定义,则 Array.isArray(drugPrice.mailPrice.rejectMessage) 将引发错误。

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 为空或未定义,则执行 data.name 可能会破坏您的应用程序。例如,给定以下对象。

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')
Junius L
2019-05-29

您实际上不需要实际执行 .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) {
    //...
}

如果您有较长的对象路径等,它会变得很乏味。

Akrion
2019-05-29