Aquí está el objeto de muestra.
{ abc_0: 'a', bcd_0: 'b', cde_0: 'c', abc_1: 'a', bcd_1: 'b', cde_1: 'c', def_1: 'd', }Quiero agrupar a través del número con el que terminan y quiero que el resultado esperado sea
{ 0: {abc: 'a', bcd: 'b', cde: 'c'}, 1: {abc: 'a', bcd: 'b', cde: 'c', def : 'd'}, }Puedes probar esta solución:
const data = { abc_0: 'a', bcd_0: 'b', cde_0: 'c', abc_1: 'a', bcd_1: 'b', cde_1: 'c', def_1: 'd', }; const result = Object.entries(data).reduce((acc, [combo, value]) => { const [key, index] = combo.split('_'); acc[index] = { ...acc[index], [key]: value }; return acc; }, {}); console.log(result);Puedes escribir algo como esto para lograrlo.
const obj = { abc_0: 'a', bcd_0: 'b', cde_0: 'c', abc_1: 'a', bcd_1: 'b', cde_1: 'c', def_1: 'd', }; const groupByChar = () => { const res = {}; for (let k in obj){ const char = k.charAt(k.length-1); if (!res[char]){ res[char] = {}; } const key = k.substring(0, k.length - 2); res[char][key] = obj[k]; } return res; } const res = groupByChar(); console.log(res);Interrumpí deliberadamente la secuencia de datos para satisfacer mejor sus necesidades.
const data = { abc_0: 'a', abc_1: 'a', bcd_0: 'b', bcd_1: 'b', cde_0: 'c', cde_1: 'c', def_0: 'd', def_1: 'd', }; const res = Object.keys(data) .map((key) => { const [char, num] = key.split('_'); return { [num]: { [char]: data[key], }, }; }) .reduce((acc, cur) => { const acc_keys = Object.keys(acc); const [cur_key] = Object.keys(cur); if (acc_keys.includes(cur_key)) { acc[cur_key] = { ...acc[cur_key], ...cur[cur_key] }; return { ...acc, }; } else { return { ...acc, ...cur }; } }, {}); console.log(res);