javascript: cómo agrupar el valor clave de una matriz

CorePress2024-01-25  9

Recibo la respuesta de API como se muestra a continuación

[{id: 1, fileName:"abc.png",docid:"123",controlNumb:"11"},
{id:2,fileName:"mno.png",docid:"121",controlNumb:"12"},
{id:1,fileName:"def.png",docid:"120",controlNumb:"11"},
{id:3,fileName:"xyz.png",docid:"125",controlNumb:"13"},
{id:2,fileName:"rst.png", docid:"126",controlNumb:"12"}]

en qué quiero convertir

[{id: 1, fileName:["abc.png",def.png],docid:["123","120"],controlNumb:"11"},
{id: 2, fileName:["mno.png",rst.png],docid:["121","126"],controlNumb:"12"}
{id: 3, fileName:["xyz.png"],docid:["125"],controlNumb:"11"}

Probé el método .reduce y está dando el mismo resultado, pero el nombre de archivo y el tipo muestran objetos que no puedo usar para asignar esas claves.

en caso de que la identificación esté en blanco, quiero agrupar por controlNumb

debajo del código, lo intenté

 let newDirectory = Object.values(
       this.state.data.reduce((acc, item) => {
         if (!acc[item.id])
          acc[item.id] = {
           id: item.id,
           controlNumb: item.controlNumb,
            docid: [],
            fileName: [],
          };
         acc[item.id].docid.push(item.docid);
         acc[item.id].fileName.push(item.fileName);
         return acc;
       }, {})
     );
     console.log("newDirectory", newDirectory);

El código anterior devuelve una matriz pero su tipo de objeto, por lo que no puedo usar el mapa dentro del nombre del archivo



------------------------------------

Puede recorrer los datos y agrupar los valores según la misma identificación, luego expandir las propiedades de fileName y docid a matrices, por ejemplo:

const data = [{ id: 1, fileName: "abc.png", docid: "123", controlNumb: "11" },
{ id: 2, fileName: "mno.png", docid: "121", controlNumb: "12" },
{ id: 1, fileName: "def.png", docid: "120", controlNumb: "11" },
{ id: 3, fileName: "xyz.png", docid: "125", controlNumb: "13" },
{ id: 2, fileName: "rst.png", docid: "126", controlNumb: "12" }];

const parsedData = [];

for (const item of data) {
  const index = parsedData.findIndex(storedItem => storedItem.id === item.id);
  if (index === -1) {
    const newItem = { ...item, fileName: [item.fileName], docid: [item.docid] }
    parsedData.push(newItem);
    }
  else {
    parsedData[index].fileName.push(item.fileName);
    parsedData[index].docid.push(item.docid);
  }
}

console.log(parsedData);

0



------------------------------------

Para este tipo de operación sugiero usar Lodash. Es una biblioteca genial con toneladas de métodos útiles para ayudarte en tu proyecto.

https://lodash.com/docs/

Lodash tiene un método groupBy, fácil de usar, y creo que hace lo que buscas. Entonces, en tu caso, tendrías algo como esto:

const newDirectory = _.groupBy(this.state.data, "id");

Básicamente, pasas la matriz que deseas agrupar, junto con el nombre de la clave por la que deseas agrupar.

Espero que esto haya sido útil.

1

gracias por la respuesta pero quería hacerlo sin biblioteca. y el código @Marcos funcionó para mí.

– ajay 24

28 de marzo de 2021 a las 7:42

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare