Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

126
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!