当我检查数组的长度时,出现以下错误。正确的方法是什么?
main.js
if (drugPrice.mailPrice.rejectMessage.length !== 0 && Array.isArray(drugPrice.mailPrice.rejectMessage)) {
//code goes here
}
错误
TypeError: Cannot read property 'length' of undefined
答案 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
进行检查的结果相同
话虽这么说,但是您的路径很长,因此您可能希望确保它们有效。意思是如果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) {
//...
}
如果对象路径等很长,这将变得很乏味。
答案 3 :(得分:0)
您的代码中的问题是javascript在检查数组是否为数组类型之前先检查数组长度。您应该在if语句中更改顺序。
您可以尝试:
if (myArr && Array.isArray(myArr) && myArr.length !== 0) {
// your code
}
现在,代码以正确的顺序执行。
第二个条件检查myArr是否为数组类型,您也可以这样做:
if(myArr && myArr.push && myArr.length!== 0){ //您的代码 }
第三个条件检查myArr是否不为空。