Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

125
Vistas
obtener objetos únicos de una matriz de objetos anidados y subpropiedades

tengo una secuencia de comandos en la que intento obtener el objeto único según el estado de la matriz de objetos

Los siguientes scripts funcionan bien, pero tengo un caso en el que he anidado un objeto en un tipo de estado que tiene un subestado, por lo que quiero encontrar el único de la matriz de objetos y obtener el único.

El siguiente fragmento puedo obtener el primer nivel, pero si vemos el estado => "EF" tiene un sub_estado_detalles, entonces necesito obtener el único de sub_estado_detalles si el estado es EF

 let inputArray = [{ state: "AB", }, { state: "BC", }, { state: "BC", }, { state: "CD", }, { state: "CD", }, { state: "DE", }, { state: "EF", sub_state_details: { state: "EF-1" } }, { state: "EF", sub_state_details: { state: "EF-1" } }, { state: "EF", sub_state_details: { state: "EF-2" } } ] let resArr = [] inputArray.filter(function(item) { var i = resArr.findIndex(x => (x.state == item.state)); if (i <= -1) { resArr.push({ state: item.state }); } return null; }); console.log(resArr)

Rendimiento esperado

 let output = [{ state: "AB", }, { state: "BC", }, { state: "CD", }, { state: "DE", }, { state: "EF-1", },{ state: "EF-2", }]
about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

Otras respuestas pueden darle el resultado correcto, pero están usando funciones de matriz incorrectamente, dado que se basan en su intento. por ejemplo, algunos usan el filter pero nunca usan el resultado del filter . o tratando de return null de forEach aunque forEach no lo haga. devolver cualquier cosa

reduce() se adapta mejor a su caso, ya que está reduciendo una matriz a otra, según algunas condiciones:

 let inputArray = [{ state: "AB", }, { state: "BC", }, { state: "BC", }, { state: "CD", }, { state: "CD", }, { state: "DE", }, { state: "EF", sub_state_details: { state: "EF-1" } }, { state: "EF", sub_state_details: { state: "EF-1" } }, { state: "EF", sub_state_details: { state: "EF-2" } } ] const result = inputArray.reduce((acc, cur) => { if(!acc.find((accItem) => accItem.state == cur.state)) { if(cur.state === 'EF') { if(cur.sub_state_details && !acc.find((accItem) => accItem.state === cur.sub_state_details.state)) { acc.push({state: cur.sub_state_details.state}) } } else { acc.push({state: cur.state}) } } return acc; }, []) console.log(result)

about 4 years ago · Juan Pablo Isaza Denunciar

0

Puede usar una declaración condicional para verificar si existe sub_state_details .

Como esto:

 let inputArray = [ { state: "AB", }, { state: "BC", }, { state: "BC", }, { state: "CD", }, { state: "CD", }, { state: "DE", }, { state: "EF", sub_state_details: { state: "EF-1", }, }, { state: "EF", sub_state_details: { state: "EF-1", }, }, { state: "EF", sub_state_details: { state: "EF-2", }, }, ]; let resArr = []; inputArray.filter(function (item) { var i = resArr.findIndex((x) => x.state == item.state); if (i <= -1) { if (item.sub_state_details) { resArr.push({ state: item.sub_state_details.state, }); } else { resArr.push({ state: item.state, }); } } return null; }); console.log(resArr);

about 4 years ago · Juan Pablo Isaza Denunciar

0

Esta es en realidad una solución bastante simple. Primero debe verificar si sub_state_details existe. Si es así, necesitamos usar ese state en su lugar. Podemos lograr esto usando una variable llamada "sub", y si el objeto sub_state_details está definido, usamos sub_state_details.state en lugar de item.state .

 let inputArray = [{ state: "AB", }, { state: "BC", }, { state: "BC", }, { state: "CD", }, { state: "CD", }, { state: "DE", }, { state: "EF", sub_state_details: { state: "EF-1" } }, { state: "EF", sub_state_details: { state: "EF-1" } }, { state: "EF", sub_state_details: { state: "EF-2" } } ] let resArr = [] inputArray.filter(function(item) { var i = resArr.findIndex(x => (x.state == item.state)); let sub = item.sub_state_details; if(!sub) {sub=item} if (i <= -1) { resArr.push({ state: sub.state }); } return null; }); console.log(resArr)

Espero poder ayudar.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda