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", }]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)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);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.