find, includes, some y every en JavaScript | Nicolás Garzón
Estos métodos responden preguntas sobre una colección sin construir necesariamente otro array completo.
Texto
Copiar find / findLast → ¿Cuál elemento cumple?
includes → ¿Existe este valor?
some → ¿Alguno cumple?
every → ¿Todos cumplen?Devuelve el primer elemento cuyo callback produce un valor truthy.
JavaScript
Copiar const product = products. find (
( product ) => product. id === targetId,
) ; No devuelve un array. Para conservar todos los que cumplen usa filter.
JavaScript
Copiar const index = products. findIndex (
( product ) => product. id === targetId,
) ; JavaScript
Copiar if ( index !== - 1 ) {
products[ index] = updatedProduct;
} En código inmutable puede combinarse con with.
JavaScript
Copiar const next = index === - 1
? products
: products. with ( index, updatedProduct) ; JavaScript
Copiar const latestCompleted = orders. findLast (
( order ) => order. status === "completed" ,
) ; JavaScript
Copiar const index = orders. findLastIndex (
( order ) => order. status === "completed" ,
) ; No necesitan invertir la colección y conservan sus índices originales.
JavaScript
Copiar const values = [ undefined ] ;
values. find ( ( ) => true ) ; El retorno no permite distinguir si:
No hubo coincidencia.
La coincidencia tenía valor undefined.
Cuando esa diferencia importa, usa findIndex o una estructura con un resultado explícito.
JavaScript
Copiar const roles = [ "admin" , "editor" ] ;
roles. includes ( "admin" ) ; Puede recibir un índice inicial.
JavaScript
Copiar [ 1 , 2 , 1 ] . includes ( 1 , 1 ) ; Índices negativos cuentan desde el final.
JavaScript
Copiar [ 1 , 2 , 3 ] . includes ( 2 , - 2 ) ; includes utiliza una comparación similar a SameValueZero.
JavaScript
Copiar [ NaN ] . includes ( NaN ) ;
[ 0 ] . includes ( - 0 ) ; Esto lo diferencia de indexOf con NaN.
JavaScript
Copiar [ NaN ] . indexOf ( NaN ) ; Para objetos, la identidad sigue importando.
JavaScript
Copiar const user = { id : 1 } ;
[ user] . includes ( user) ;
[ user] . includes ( { id : 1 } ) ; JavaScript
Copiar const values = [ "A" , "B" , "A" ] ;
values. indexOf ( "A" ) ;
values. lastIndexOf ( "A" ) ; Son útiles cuando buscas un valor concreto y necesitas su posición.
Para condiciones sobre propiedades usa findIndex.
Devuelve true si al menos un elemento cumple.
JavaScript
Copiar const hasOutOfStock = products. some (
( product ) => product. stock === 0 ,
) ; Se detiene al encontrar el primer resultado truthy.
JavaScript
Copiar const canEdit = user. permissions. some (
( permission ) =>
permission === "products:write" ,
) ; Devuelve true si todos los elementos cumplen.
JavaScript
Copiar const allValid = items. every (
( item ) => item. quantity > 0 ,
) ; Se detiene en el primer resultado falsy.
JavaScript
Copiar [ ] . some ( ( ) => true ) ;
[ ] . every ( ( ) => false ) ; some pregunta si existe al menos un caso; en un array vacío no existe ninguno.
every pregunta si existe una violación; en un array vacío no encuentra ninguna. Este resultado se conoce como verdad vacía.
En reglas de negocio quizá también necesites exigir elementos.
JavaScript
Copiar const isValidOrder =
items. length > 0 &&
items. every ( isValidItem) ; JavaScript
Copiar const isAvailable = ( product ) =>
product. isActive && product. stock > 0 ;
const firstAvailable = products. find ( isAvailable) ;
const hasAvailable = products. some ( isAvailable) ;
const allAvailable = products. every ( isAvailable) ; Un nombre permite reutilizar y probar la regla.
JavaScript
Copiar const result = values. some ( ( value ) => {
console. log ( value) ;
return value === target;
} ) ; Cuando encuentra target, no sigue llamando el callback.
No coloques efectos que deban ejecutarse para todos los elementos dentro de un método con cortocircuito.
JavaScript
Copiar selectedUsers. includes ( user) ; JavaScript
Copiar selectedUsers. some (
( selected ) => selected. id === user. id,
) ; En dominios con identificadores estables, la segunda regla puede representar mejor la identidad del negocio.
some, every y find no esperan promesas.
JavaScript
Copiar products. some ( async ( product ) => {
return canAccess ( product) ;
} ) ; La promesa es truthy, así que el resultado puede ser incorrecto.
Resuelve las condiciones antes o recorre de forma explícita.
JavaScript
Copiar let accessibleProduct = null ;
for ( const product of products) {
if ( await canAccess ( product) ) {
accessibleProduct = product;
break ;
}
} some y every omiten holes. find y findIndex tratan las posiciones vacías como valores undefined durante la búsqueda.
No uses arrays dispersos si estas diferencias no son parte intencional del modelo.
JavaScript
Copiar const hasUnavailableItem = cart. items. some (
( item ) => ! item. product. isActive,
) ;
const allQuantitiesValid = cart. items. every (
( item ) =>
Number. isInteger ( item. quantity) &&
item. quantity > 0 ,
) ;
const targetItem = cart. items. find (
( item ) => item. product. id === productId,
) ; Cada método expresa una pregunta concreta del dominio.
Esperar un array como retorno de find.
Comparar objetos por contenido con includes.
Confundir indexOf y findIndex.
Olvidar que find puede devolver undefined como valor válido.
Suponer que every sobre un array vacío devuelve false.
Colocar efectos obligatorios dentro de métodos con cortocircuito.
Usar callbacks async esperando que sean esperados.
Recorrer todo manualmente cuando la pregunta ya tiene un método específico.
find retorna el primer elemento; findIndex, su posición.
findLast busca desde el final.
includes comprueba valores y reconoce NaN.
Los objetos se comparan por identidad.
some pregunta si alguno cumple.
every pregunta si todos cumplen.
Ambos se detienen cuando conocen la respuesta.
every sobre un array vacío devuelve true.
¿Por qué esta expresión devuelve false?
JavaScript
Copiar [ { id : 1 } ] . includes ( { id : 1 } ) ; Respuesta Porque son objetos diferentes. includes compara su identidad, no sus propiedades. Para buscar por id debe utilizarse some, find o findIndex con una condición.
reduce y agrupación muestra cómo acumular una secuencia en un resultado y cómo agrupar elementos mediante claves.