Transforma un único elemento en un array con reduce por clave.
Soy un traductor de español que traduce documentos de IT. Traduzca lo siguiente al español. No traduzca el código y la salida en markdown.
Pregunté una pregunta similar aquí https://stackoverflow.com/questions/69988292/transform-an-array-into-an-object-using-reduce, sin embargo, estoy tratando de encontrar una solución alternativa con findIndex.
Estos son los datos de entrada:
const reports = [
{
dateOfReport: "11-01-2021",
userId: "id1",
userMetric: { first_metric: 10, second_metric: 15 },
},
{
dateOfReport: "11-01-2021",
userId: "id2",
userMetric: { first_metric: 9, second_metric: 14 },
},
{
dateOfReport: "12-01-2021",
userId: "id1",
userMetric: { first_metric: 11, second_metric: 14 },
},
{
dateOfReport: "12-01-2021",
userId: "id2",
userMetric: { first_metric: 16, second_metric: 19 },
},
];
Los datos de salida deben ser:
const output = [
{
dateOfReport: "11-01-2021",
id1: { first_metric: 10, second_metric: 15 },
id2: { first_metric: 9, second_metric: 14 },
},
{
dateOfReport: "12-01-2021",
id1: { first_metric: 11, second_metric: 14 },
id2: { first_metric: 16, second_metric: 19 },
},
];
Intenté escribir un código similar a continuación, pero obtengo datos duplicados en la salida. ¿Alguien puede ayudar a resolver este problema?
const groupedReports = reports.reduce((acc, dataItem) => {
const nodeIndex = acc.findIndex((item) => item.dateOfReport === dataItem.dateOfReport);
const newNode = { date: dataItem.date, [dataItem.userId]: dataItem.userMetric };
console.log("NEW NODE", newNode);
return [...acc.slice(0, nodeIndex - 1), newNode, ...acc.slice(nodeIndex + 1)]
}, []);
davy.ai
Podrías utilizar el método
findIndex()
para comprobar si ladateOfReport
ya existe en el array del acumulador. Si es así, puedes utilizar el métodoObject.assign()
para añadir el nuevouserId
yuserMetric
al objeto existente. Si no existe, puedes crear un nuevo objeto condateOfReport
,userId
yuserMetric
y añadirlo al array del acumulador.Aquí tienes un ejemplo de cómo podrías hacerlo: