es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo asignar un objeto con propiedades a una propiedad de otro objeto usando reduce

Tengo un conjunto de datos como este:

const dataSet = [
   {
     'Transactions.productRef': 'SomeRef/123',
     'Transactions.itemCount': 25,
     'Transactions.revenue': 1000,
   },
   {
     'Transactions.productRef': 'SomeRef/124',
     'Transactions.itemCount': 35,
     'Transactions.revenue': 500,
   },
];

Y estoy tratando de asignar un objeto con propiedades al valor de “Transactions.productRef” para obtener algo como esto:

{
  'SomeRef/123': {
     productRef: 'SomeRef/123',
     soldTickets: 25,
     revenue: 1000,
   },
  'SomeRef/124': {
     productRef: 'SomeRef/124',
     soldTickets: 35,
     revenue: 500,
   }
}

Luego, quiero crear un nuevo array con estos objetos. He intentado algo como esto:

const dataSet = [
  {
    'Transactions.productRef': 'SomeRef/123',
    'Transactions.itemCount': 25,
    'Transactions.revenue': 1000,
  }, {
    'Transactions.productRef': 'SomeRef/124',
    'Transactions.itemCount': 35,
    'Transactions.revenue': 500,
  },
];

const productMap = {};

dataSet.reduce((data, p) => {
    p[data['Transactions.productRef']] = p[data['Transactions.productRef']] 
       || {};
    p[data['Transactions.productRef']].soldTickets = 
       data['Transactions.itemCount'];
    p[data['Transactions.productRef']].revenue = 
       data['Transactions.revenue'];
    p[data['Transactions.productRef']].productRef = 
       data['Transactions.productRef'];
    return p;
 }, productMap);

 const newData = Object.values(productMap);
 console.log(newData);

Pero el console.log devuelve un array vacío como si los datos nunca se hubieran asignado al objeto productMap. ¿Qué estoy haciendo mal? ¡Gracias de antemano!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que el método reduce() no fue utilizado correctamente. La función de devolución de llamada en reduce() debería devolver el acumulador después de cada iteración, pero el código está devolviendo el objeto actual p en su lugar. Además, las propiedades del objeto no fueron accedidas correctamente porque las claves del objeto contienen notación de punto. Aquí hay un código corregido que debería funcionar:

    const dataSet = [
      {
        'Transactions.productRef': 'SomeRef/123',
        'Transactions.itemCount': 25,
        'Transactions.revenue': 1000,
      }, {
        'Transactions.productRef': 'SomeRef/124',
        'Transactions.itemCount': 35,
        'Transactions.revenue': 500,
      },
    ];
    
    const productMap = {};
    
    dataSet.reduce((acc, curr) => {
      const productRef = curr['Transactions.productRef'];
      acc[productRef] = {
        productRef,
        soldTickets: curr['Transactions.itemCount'],
        revenue: curr['Transactions.revenue'],
      };
      return acc;
    }, productMap);
    
    const newData = Object.values(productMap);
    console.log(newData);
    

    En este código, el método reduce() se utiliza para iterar sobre la matriz dataSet y acumular los objetos en productMap. La función de devolución de llamada toma un objeto actual curr y un objeto acumulador acc. Utiliza la referencia del producto ('Transactions.productRef') como clave para las propiedades del objeto en productMap y asigna los valores correspondientes a las propiedades soldTickets, revenue y productRef. Finalmente, la función devuelve el objeto acumulador actualizado acc. La constante newData crea una nueva matriz con los valores de objeto de productMap.

Comments are closed.