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.

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)]
}, []);
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Podrías utilizar el método findIndex() para comprobar si la dateOfReport ya existe en el array del acumulador. Si es así, puedes utilizar el método Object.assign() para añadir el nuevo userId y userMetric al objeto existente. Si no existe, puedes crear un nuevo objeto con dateOfReport, userId y userMetric y añadirlo al array del acumulador.

    Aquí tienes un ejemplo de cómo podrías hacerlo:

    const groupedReports = reports.reduce((acc, dataItem) => {
      const nodeIndex = acc.findIndex(item => item.dateOfReport === dataItem.dateOfReport);
      const newNode = { date: dataItem.date, [dataItem.userId]: dataItem.userMetric };
    
      if (nodeIndex === -1) {
        return [...acc, newNode];
      } else {
        const updatedNode = Object.assign({}, acc[nodeIndex], newNode);
        return [...acc.slice(0, nodeIndex), updatedNode, ...acc.slice(nodeIndex + 1)];
      }
    }, []);
    

Comments are closed.