在 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
进行检查相同的结果>
话虽如此,但您的路径很长,因此您可能希望确保它们有效。这意味着如果
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) {
//...
}
如果您有较长的对象路径等,它会变得很乏味。
Akrion
2019-05-29