Tengo arr = [1,2,3] e ids = [1,2,3,4,5,6] . Quiero encontrar si alguno de los arr item existe en los ids . En caso afirmativo, el invalid es verdadero.
¿Cuál de los siguientes códigos es mejor? o son lo mismo?
const invalid = !arr.every((id) => ~ids.indexOf(id)); const invalid = arr.some((id) => ids.includes(id));Las dos declaraciones tienen una semántica muy diferente.
Las devoluciones de llamada son las mismas, es decir, ids.includes(id) === true es equivalente a ~ids.indexOf(id) != 0 . Pero arr.some() y !arr.every() tienen una semántica diferente:
some() devuelve true si al menos un elemento se ajusta a la condición!every() devuelve true si al menos un elemento no cumple la condición Entonces, en realidad, su primer fragmento no está verificando si hay al menos un elemento en arr que también está contenido en ids , pero si hay al menos un elemento en arr que no está contenido en ids
Entonces, la versión correcta del primer fragmento sería
const invalid = !arr.every((id) => !(~ids.indexOf(id))); Es decir, comprobar si no todos los elementos de arr están contenidos en ids . Desde un punto de vista computacional, son más o menos lo mismo:
indexOf e includes retorno en el primer elemento elemento que encuentransome se detienen cuando la devolución de llamada se vuelve true por primera vezevery se detiene cuando la devolución de llamada devuelve false por primera vez~ y !Pero si compara esto con su segundo fragmento, parece bastante obvio que es mucho más complejo de leer y comprender y, por lo tanto, mucho más complejo de mantener.
const arr = [1,2,3], ids = [1,2,3,4,5,6] const i1 = !arr.every((id) => ~ids.indexOf(id)), i2 = arr.some((id) => ids.includes(id)), i3 = !arr.every((id) => !(~ids.indexOf(id))); console.log(i1, i2, i3)