Hay una función que agrupa una matriz de objetos por clave. Por ejemplo una matriz:
data: [ { CS_NAME: "AAA", IS_MAIN: "Y", WEBSITE_CREATE_DATE: "2021-06-01T15:50:37.687", }, { CS_NAME: "AAA", IS_MAIN: "N", WEBSITE_CREATE_DATE: "2021-08-03T12:02:58.07", }, { CS_NAME: "BBB", IS_MAIN: "Y", WEBSITE_CREATE_DATE: "2021-08-03T12:02:58.07", }, { CS_NAME: "BBB", IS_MAIN: "N", WEBSITE_CREATE_DATE: "2019-01-26T00:00:00", }, { CS_NAME: "CCC", IS_MAIN: "Y", WEBSITE_CREATE_DATE: "2019-01-26T00:00:00", }, ]grupo de funciones por:
groupBy(input, key) { return input.reduce((acc, currentValue) => { let groupKey = currentValue[key]; if (!acc[groupKey]) { acc[groupKey] = []; } acc[groupKey].push(currentValue); return acc; }, {}); }, let obj = groupBy(data, "CS_NAME");Cómo cambiar esta función para que devuelva una matriz de objetos, cada uno de los cuales tendrá dos campos:
{ title: "CS_NAME" // the key by which objects were grouped or any other property content: {obj} // the whole object }Por ejemplo, la salida debería ser así:
{ title: "AAA", content: [ { CS_NAME: "AAA", IS_MAIN: "Y", WEBSITE_CREATE_DATE: "2021-06-01T15:50:37.687", }, { CS_NAME: "AAA", IS_MAIN: "N", WEBSITE_CREATE_DATE: "2021-08-03T12:02:58.07", }, ], }Podría mapear los valores agrupados y agregar algunas propiedades.
const groupBy = (input, key) => input.reduce((acc, currentValue) => { (acc[currentValue[key]] ??= []).push(currentValue); return acc; }, {}), data = [{ CS_NAME: "AAA", IS_MAIN: "Y", WEBSITE_CREATE_DATE: "2021-06-01T15:50:37.687" }, { CS_NAME: "AAA", IS_MAIN: "N", WEBSITE_CREATE_DATE: "2021-08-03T12:02:58.07" }, { CS_NAME: "BBB", IS_MAIN: "Y", WEBSITE_CREATE_DATE: "2021-08-03T12:02:58.07" }, { CS_NAME: "BBB", IS_MAIN: "N", WEBSITE_CREATE_DATE: "2019-01-26T00:00:00" }, { CS_NAME: "CCC", IS_MAIN: "Y", WEBSITE_CREATE_DATE: "2019-01-26T00:00:00" }], result = Object .entries(groupBy(data, "CS_NAME")) .map(([title, content]) => ({ title, content })); console.log(result); .as-console-wrapper { max-height: 100% !important; top: 0; }Puede actualizar su función groupBy como se muestra a continuación para obtener el resultado deseado. Obtenga la salida de la salida actual con Object.entries y map a una matriz nuevamente.
const data = [ { CS_NAME: "AAA", IS_MAIN: "Y", WEBSITE_CREATE_DATE: "2021-06-01T15:50:37.687", }, { CS_NAME: "AAA", IS_MAIN: "N", WEBSITE_CREATE_DATE: "2021-08-03T12:02:58.07", }, { CS_NAME: "BBB", IS_MAIN: "Y", WEBSITE_CREATE_DATE: "2021-08-03T12:02:58.07", }, { CS_NAME: "BBB", IS_MAIN: "N", WEBSITE_CREATE_DATE: "2019-01-26T00:00:00", }, { CS_NAME: "CCC", IS_MAIN: "Y", WEBSITE_CREATE_DATE: "2019-01-26T00:00:00", }, ]; const groupBy = (input, key) => { return Object.entries( input.reduce((acc, currentValue) => { let groupKey = currentValue[key]; if (!acc[groupKey]) { acc[groupKey] = []; } acc[groupKey].push(currentValue); return acc; }, {}) ).map(([title, content]) => ({ title, content })); }; const obj = groupBy(data, "CS_NAME"); console.log(obj);