Búsqueda de sitios web

angular - Cómo convertir los valores de un arreglo en un arreglo filtrado


Tengo este problema, uso Angular 8, espero que puedas ayudarme, no he podido resolverlo durante mucho tiempo.

Tengo este arreglo:

datos = [{
    Description: 'Puede Insertar',
    Id: 1,
    Type: 'ADMON',
    Value: '1'
  },
  {
    Description: 'Puede Insertar',
    Id: 1,
    Type: 'ADMON',
    Value: '2'
  },
  {
    Description: 'Puede Insertar',
    Id: 1,
    Type: 'ADMON',
    Value: '3'
  },
  {
    Description: 'Puede Insertar',
    Id: 1,
    Type: 'USER',
    Value: '1'
  },
  {
    Description: 'Puede Insertar',
    Id: 1,
    Type: 'USER',
    Value: '2'
  },
  {
    Description: 'Puede Insertar',
    Id: 1,
    Type: 'USER',
    Value: '4'
  },
]

Necesito filtrarlos y agruparlos así:

result = [
  {ADMON: {0: 1, 
           1: 2, 
           2: 3, 
           3: 4}},
  {USER:  {0: 1, 
           1: 2, 
           2: 4}}
];

He intentado muchas maneras pero no puedo, espero que puedas ayudarme, muchas gracias de antemano.

Respuesta #1

Aquí hay una posible solución que utiliza varios métodos de arreglo para realizar la tarea en cuestión.

const datos = [{
    Description: 'Puede Insertar',
    Id: 1,
    Type: 'ADMON',
    Value: '1'
  },
  {
    Description: 'Puede Insertar',
    Id: 1,
    Type: 'ADMON',
    Value: '2'
  },
  {
    Description: 'Puede Insertar',
    Id: 1,
    Type: 'ADMON',
    Value: '3'
  },
  {
    Description: 'Puede Insertar',
    Id: 1,
    Type: 'USER',
    Value: '1'
  },
  {
    Description: 'Puede Insertar',
    Id: 1,
    Type: 'USER',
    Value: '2'
  },
  {
    Description: 'Puede Insertar',
    Id: 1,
    Type: 'USER',
    Value: '4'
  }
];

const grouped = datos.reduce((acc, el) => {
  if (!acc[el.Type]) acc[el.Type] = {};
  const index = Object.values(acc[el.Type]).length;
  acc[el.Type] = {
    ...acc[el.Type],
    [index]: el.Value
  }
  return acc;
}, {});

const final = Object.entries(grouped).map(([key, val]) => {
  return { [key]: val }
});

console.log(final);

Respuesta #2

const datos = [{Description:'Puede Insertar',Id:1,Type:'ADMON',Value:'1'},{Description:'Puede Insertar',Id:1,Type:'ADMON',Value:'2'},{Description:'Puede Insertar',Id:1,Type:'ADMON',Value:'3'},{Description:'Puede Insertar',Id:1,Type:'USER',Value:'1'},{Description:'Puede Insertar',Id:1,Type:'USER',Value:'2'},{Description:'Puede Insertar',Id:1,Type:'USER',Value:'4'}];


let result = Object.entries(datos.reduce((acc, {Type, Value}) => {
	         (acc[Type] = acc[Type] || []).push(Value);
	           return acc;
               }, {}))
             .map((o) => { return {[o[0]]: {...o[1]}}});
	
console.log(result);