¿Cuál es la mejor forma de comprobar si una matriz está vacía o no existe?
¿Algo como esto?
if(array.length < 1 || array == undefined){
//empty
}
Usted quiere hacer la comprobación de undefined
en primer lugar. Si lo haces al revés, se generará un error si el array es indefinido.
if (array === undefined || array.length == 0) {
// array empty or does not exist
}
Esta respuesta está recibiendo una buena cantidad de atención, por lo que me gustaría señalar que mi respuesta original, más que cualquier otra cosa, abordó el orden incorrecto de las condiciones que se evalúan en la pregunta. En este sentido, no aborda varios escenarios, como los valores null
, otros tipos de objetos con una propiedad length
, etc. Tampoco es un JavaScript muy idiomático.
**El enfoque infalible
Inspirándome un poco en los comentarios, a continuación expongo lo que actualmente considero el método infalible para comprobar si un array está vacío o no existe. También tiene en cuenta que la variable puede no referirse a un array, sino a algún otro tipo de objeto con una propiedad length
.
if (!Array.isArray(array) || !array.length) {
// array does not exist, is not an array, or is empty
// ⇒ do not attempt to process array
}
Para descomponerlo:
Array.isArray()
, como era de esperar, comprueba si su argumento es un array. Esto elimina valores como null
, undefined
y cualquier otra cosa que no sea un array.
Ten en cuenta que esto también eliminará objetos tipo array, como el objeto arguments
y los objetos DOM NodeList
. Dependiendo de tu situación, puede que este no sea el comportamiento que buscas.
La condición array.length
comprueba si la propiedad length
de la variable se evalúa a un valor truthy. Dado que la condición anterior ya ha establecido que se trata de un array, no se requieren comparaciones más estrictas como array.length != 0
o array.length !== 0
.
**El enfoque pragmático En muchos casos, lo anterior puede parecer excesivo. Quizás estés usando un lenguaje de orden superior como TypeScript que hace la mayor parte de la comprobación de tipos en tiempo de compilación, o realmente no te importa si el objeto es realmente un array, o sólo un array.
En esos casos, tiendo a usar el siguiente JavaScript, más idiomático:
if (!array || !array.length) {
// array or array.length are falsy
// ⇒ do not attempt to process array
}
O, más frecuentemente, su inverso:
if (array && array.length) {
// array and array.length are truthy
// ⇒ probably OK to process array
}