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!
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 enreduce()
debería devolver el acumulador después de cada iteración, pero el código está devolviendo el objeto actualp
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:En este código, el método
reduce()
se utiliza para iterar sobre la matrizdataSet
y acumular los objetos enproductMap
. La función de devolución de llamada toma un objeto actualcurr
y un objeto acumuladoracc
. Utiliza la referencia del producto ('Transactions.productRef'
) como clave para las propiedades del objeto enproductMap
y asigna los valores correspondientes a las propiedadessoldTickets
,revenue
yproductRef
. Finalmente, la función devuelve el objeto acumulador actualizadoacc
. La constantenewData
crea una nueva matriz con los valores de objeto deproductMap
.