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 arreglo result.

    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