0

Tengo una lista de objetos de la siguiente manera:

let arreglo = [{"sectorId":1},{"sectorId":2},{"sectorId":3},{"sectorId":4},{"sectorId":5},{"sectorId":6},{"sectorId":7},{"sectorId":8}];

Y necesito saber: ¿Cómo es que puedo saber si existe un objeto consultando solo por el ID?

g.4
  • 2,956
  • 2
  • 8
  • 19
German
  • 1
  • 2
    ¿Responde esto a tu pregunta? [Obtener indice de un elemento en un Array de Objetos JavaScript](https://es.stackoverflow.com/questions/252455/obtener-indice-de-un-elemento-en-un-array-de-objetos-javascript) – Mauricio Contreras Aug 11 '21 at 05:08

3 Answers3

1

Podrías probar:

if(arreglo.findIndex( (e) => e.sectorId === 5) !== -1) {
// existe
} else {
 // no existe 
}

Luego utilizas una variable y reemplazas el 5 de ser necesario.

Acá dejo el enlace a la documentación: https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex

También podrías utilizar el método find el cual retorna el elemento encontrado o undefined:

if(arreglo.find( (e) => e.sectorId === 5)) {
// existe
} else {
 // no existe 
}

https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/find

  • 1
    Buena respuesta, sin embargo, un enlace a la documentación de [.find()](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/find) la haría mucho mejor. – Triby Aug 11 '21 at 04:42
  • 1
    `find` devuelve `undefined` si no existe el elemento, así que no deberías comparar con `-1`, para eso tendrías que usar `findIndex` – ArianJM Aug 11 '21 at 09:06
  • Correcto, @ArianJM. Ahí se encuentra editada – sebastian yomha Aug 11 '21 at 09:50
1

Usando filter: Con la funcionalidad de array.filter() ver documentación, puedes obtener los elementos que cumplan la condición del callback que le introduzcas.

let arreglo = [{"sectorId":1},{"sectorId":2},{"sectorId":3},{"sectorId":4},{"sectorId":5},{"sectorId":6},{"sectorId":7},{"sectorId":8}];

let id=8;
let result=arreglo.filter(x=>x.sectorId==id);
console.log(result.length?"existe":"no existe");

id=9;
result=arreglo.filter(x=>x.sectorId==id);
console.log(result.length?"existe":"no existe");

Usando regex: Es menos confiable porque utilizas el texto y podría haber un salto entre un elemento y otro, pero si utilizas bien el regex podrías lograr "filtros" más complejos. Por ejemplo si el sectorId fuese compartido entre varios nodos incluido padre o hijo (diferentes herarquía).

let arreglo = [{"sectorId":1},{"sectorId":2},{"sectorId":3},{"sectorId":4},{"sectorId":5},{"sectorId":6},{"sectorId":7},{"sectorId":8}];
let id=5;
console.log(JSON.stringify(arreglo).match(`sectorId.{0,2}${id}}`)?"existe":"no existe");

id=9;
console.log(JSON.stringify(arreglo).match(`sectorId.{0,2}${id}}`)?"existe":"no existe")
Alfredo Maussa
  • 1,294
  • 3
  • 19
1

Si sólo quieres saber si existe en el array y no necesitas recuperarlo, puedes usar some, que comprueba si al menos un elemento del array cumple la condición. En teoría debe ser más eficiente que filter, porque en el momento que encuentra un elemento que cumpla la condición, ya no sigue recorriendo el array, mientras que filter procesará todos los elementos. find tampoco recorre el array hasta el final si encuentra un elemento que cumpla antes, pero te devuelve un entero que tienes que comparar con -1 mientras que some te devuelve directamente un booleano (una diferencia menor, pero es cuestión de gustos) https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/some

if(arreglo.some(s => s.sectorId === 4)){}
S. Bonet
  • 476
  • 2
  • 6