¿No puedes entender por qué esto funciona de esta manera? ¿A qué tipo js convierte el elemento con valor = 0 y por qué?
if([1,2,0,1].find(item => item === 0)) { console.log(1); // logs nothing } console.log(0 === 0); // logs truefind devuelve el elemento que encontró, y 0 es falso, por lo que if(0) nunca ejecuta el bloque condicional.
Debe usar if (arr.includes(0)) . Alternativas que también funcionarían, pero son más feas, son
if (arr.some(item => item === 0))if (arr.findIndex(item => item === 0) > -1)if (arr.find(item => item === 0) !== undefined)No registra porque el resultado del código a continuación devuelve 0 , que es un valor falso.
const a = [1,2,0,1].find(item => item === 0) console.log(a) //a is 0Entonces, la declaración dentro del bloque if no se ejecuta.
Si ejecuta [1,2,0,1].find(item => item === 0) en la consola, verá que el resultado es 0 . Entonces encuentra su elemento y lo devuelve.
Entonces, ¿por qué no hay 1 impreso desde console.log ? Eso es porque 0 es falso, y ahora estás haciendo if (0) , por lo que tu condición nunca es verdadera.
Existen múltiples soluciones para esto, dependiendo del caso de uso, algunas tienen más sentido que otras:
1) Comprobar explícitamente !== undefined
if ([1,2,0,1].find(item => item === 0) !== undefined) { /* ... */ } Si find no encuentra nada que coincida con sus criterios, devuelve undefined , por lo que al verificar si el valor devuelto no está undefined , sabrá que se encontró el elemento.
Desventaja: si undefined es un valor posible que realmente se puede buscar, esto falla una vez más.
Además, esto solo tendría sentido si en su código real almacenara el elemento encontrado en una variable para no solo verificar su existencia sino también usarlo para otra cosa más adelante, de lo contrario, una de las otras dos opciones a continuación sería mejor elección.
2) Usa some en lugar de find
Dado que solo está interesado en si se encontró algo , y no en qué elemento exactamente, podría usar some que devuelven true / false en lugar de find , que devuelve el elemento encontrado en sí.
if ([1,2,0,1].some(item => item === 0)) { /* ... */ } 3) Use includes para buscar directamente el elemento por valor
Dado que parece que solo tiene un item === someValue verificación de algún valor, en realidad no necesita usar uno de los métodos que toman una devolución de llamada en primer lugar, ya que podría especificar el elemento por valor y usar includes , que devuelve true / false :
if ([1,2,0,1].includes(0)) { /* ... */ }