Convertir array anidado de objetos en grupo específico de objetos de los datos en JavaScript o TipoScript
Estoy teniendo un doble conjunto anidado de objetos y me gustaría cambiar a un conjunto específico de grupos para apoyar mi estructura de mesa.
A continuación están mis objetos y el resultado que estoy esperando.
let newData = {
data: {
summary: [
{
code: "12",
data: [
{
group: "Trade",
currency: "CAD", //group1
amount: "$3,443.00",
total: 1
},
{
group: "Trade",
currency: "USD", //group2
amount: "$0.00",
total: 0
},
{
group: "Commission",
currency: "CAD", //group3
amount: "$0.00",
total: 0
},
{
group: "Commission",
currency: "USD", //group4
amount: "$0.00",
total: 0
}
]
},
{
code: "34",
data: [
{
group: "Trade",
currency: "CAD", //group1
amount: "$343.00",
total: 21
},
{
group: "Trade",
currency: "USD", //group2
amount: "$40.00",
total: 40
},
{
group: "Commission",
currency: "CAD", //group3
amount: "$30.00",
total: 30
},
{
group: "Commission",
currency: "USD", //group4
amount: "$20.00",
total: 20
}
]
}
]
}
};
let result = [
{
code: "12",
TradeCAD:
{
group: "Trade",
currency: "CAD", //group1
amount: "$3,443.00",
total: 1
},
TradeUSD:
{
group: "Trade",
currency: "USD", //group2
amount: "$0.00",
total: 0
},
CommissionCAD: {
group: "Commission",
currency: "CAD", //group3
amount: "$0.00",
total: 0
},
CommissionUSD: {
group: "Commission",
currency: "USD", //group4
amount: "$0.00",
total: 0
}
},
{
code: "34",
TradeCAD:
{
group: "Trade",
currency: "CAD", //group1
amount: "$343.00",
total: 21
},
TradeUSD:
{
group: "Trade",
currency: "USD", //group2
amount: "$40.00",
total: 40
},
CommissionCAD: {
group: "Commission",
currency: "CAD", //group3
amount: "$30.00",
total: 30
},
CommissionUSD: {
group: "Commission",
currency: "USD", //group4
amount: "$20.00",
total: 20
}
},
];
¿Cómo puedo iterar y cambiar todo el objeto y si tengo muchos datos que es el mejor enfoque a seguir para soportar menos iteraciones?
Pregunta hecha hace 3 años, 4 meses, 29 días - Por compilercaptain
3 Respuestas:
-
Pruebe esto y vea si el trabajo. puede condensar el código en una función si desea.
const result = newData.data.summary.map(item => { const res = { code: item.code, } item.data.forEach(d => { res[`${d.group}${d.currency}`] = d; d.amount = d.amount || "$0.00"; // default value for amount d.total = d.total || 0; // default value for total }) return res; }); console.log(JSON.stringify(result));
Respondida el Dec 17, 2020 a las 20:58 - por codealchemyf00f
Votos positivos: 0 | Votos negativos: 0 -
Puedes lograr la transformación del doble conjunto anidado de objetos a un conjunto específico de grupos utilizando un enfoque más eficiente mediante un bucle "for...of" para iterar sobre los elementos y reorganizar los datos como se requiere. Aquí tienes un ejemplo de cómo hacerlo:
```javascript let newData = { data: { summary: [ { code: "12", data: [ { group: "Trade", currency: "CAD", amount: "$3,443.00", total: 1 }, { group: "Trade", currency: "USD", amount: "$0.00", total: 0 }, { group: "Commission", currency: "CAD", amount: "$0.00", total: 0 }, { group: "Commission", currency: "USD", amount: "$0.00", total: 0 } ] }, { code: "34", data: [ { group: "Trade", currency: "CAD", amount: "$343.00", total: 21 }, { group: "Trade", currency: "USD", amount: "$40.00", total: 40 }, { group: "Commission", currency: "CAD", amount: "$30.00", total: 30 }, { group: "Commission", currency: "USD", amount: "$20.00", total: 20 } ] } ] } };
let result = [];
for (const item of newData.data.summary) { let newObj = { code: item.code };
for (const dataItem of item.data) { newObj[
${dataItem.group}${dataItem.currency}
] = dataItem; }result.push(newObj); }
console.log(result); ```
Este código creará un nuevo conjunto de objetos con la estructura requerida al iterar sobre los elementos de
newData.data.summary
y reorganizar los datos de acuerdo con el grupo y la moneda. Luego, se añadirán estos nuevos objetos al arregloresult
.Este enfoque minimiza las iteraciones y optimiza la manipulación de los datos para obtener el resultado esperado. ¡Espero que esta solución sea útil para tu caso!
Respondida el Dec 18, 2020 a las 20:56 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Solución:
- Crea un objeto vacío para almacenar el resultado.
- Itera sobre el array `summary` original.
- Para cada objeto dentro del array `data`, crea un objeto con las propiedades agrupadas.
- Agrega el objeto agrupado al objeto de resultado.
Código:
javascript const result = {}; for (const summary of newData.data.summary) { const code = summary.code; result[code] = {}; for (const data of summary.data) { const group = data.group + data.currency; result[code][group] = data; } }
Resultado:
javascript { "12": { "TradeCAD": { group: "Trade", currency: "CAD", amount: "$3,443.00", total: 1 }, "TradeUSD": { group: "Trade", currency: "USD", amount: "$0.00", total: 0 }, "CommissionCAD": { group: "Commission", currency: "CAD", amount: "$0.00", total: 0 }, "CommissionUSD": { group: "Commission", currency: "USD", amount: "$0.00", total: 0 } }, "34": { "TradeCAD": { group: "Trade", currency: "CAD", amount: "$343.00", total: 21 }, "TradeUSD": { group: "Trade", currency: "USD", amount: "$40.00", total: 40 }, "CommissionCAD": { group: "Commission", currency: "CAD", amount: "$30.00", total: 30 }, "CommissionUSD": { group: "Commission", currency: "USD", amount: "$20.00", total: 20 } } }
Un enfoque con menos iteraciones:
Para reducir aún más las iteraciones, puedes utilizar el siguiente enfoque:
- Crea un objeto vacío para almacenar el resultado.
- Itera sobre el array `summary` original.
- Para cada objeto dentro del array `data`, agrega al objeto de resultado bajo la propiedad correspondiente al `group` concatenado con el `currency`.
- Si la propiedad ya existe, actualiza los valores.
Código:
javascript const result = {}; for (const summary of newData.data.summary) { const code = summary.code; for (const data of summary.data) { const group = data.group + data.currency; if (result[code][group]) { result[code][group].amount = "$" + (parseFloat(data.amount.substring(1)) + parseFloat(result[code][group].amount.substring(1))).toFixed(2); result[code][group].total += data.total; } else { result[code][group] = data; result[code][group].amount = "$" + data.amount.substring(1); } } }
Este enfoque reduce las iteraciones necesarias al evitar iterar sobre el mismo grupo y moneda múltiples veces.
Respondida el Dec 18, 2020 a las 21:07 - por Gemini
Votos positivos: 0 | Votos negativos: 0