necesitaría su ayuda, después de recibir los datos de esta manera de una llamada api:
response = [ { area: "Z", val: "work", count: 12, data: "2022-03-01T00:00:00" }, { area: "Z", val: "not work", count: 41, data: "2022-04-01T00:00:00" }, { area: "R", val: "work", count: 55, data: "2022-03-01T00:00:00" }, { area: "R", val: "not work", count: 62, data: "2022-04-01T00:00:00" } ];Necesito un método para transformar dinámicamente este objeto en:
[ {area:'Z',count:['03-2022':{'work':12},'04-2022':{'not work':41}]}, {area:'R',count:['03-2022':{'work':55},'04-2022':{'not work':62}]]} ]Gracias
ya que su count no es una sintaxis válida. Supuse que es una matriz de objetos.
Estos problemas de agrupación se resuelven fácilmente usando reduce
const response = [{ area: "Z", val: "work", count: 12, data: "2022-03-01T00:00:00" },{ area: "Z", val: "not work", count: 41, data: "2022-04-01T00:00:00" },{ area: "R", val: "work", count: 55, data: "2022-03-01T00:00:00" },{ area: "R", val: "not work", count: 62, data: "2022-04-01T00:00:00" }]; const res = Object.values(response.reduce((acc,{area,val,count,data}) => { if(!acc[area])acc[area]={area: area, count:[]} acc[area]['count'].push({[data.substring(0,7)] : {[val]:count}}) return acc },{})) console.log(res)Si está abierto a usar lodash o guión bajo , aquí hay una solución:
const response = [{ area: "Z", val: "work", count: 12, data: "2022-03-01T00:00:00" }, { area: "Z", val: "not work", count: 41, data: "2022-04-01T00:00:00" }, { area: "R", val: "work", count: 55, data: "2022-03-01T00:00:00" }, { area: "R", val: "not work", count: 62, data: "2022-04-01T00:00:00" } ]; const group = _.groupBy(response, 'area'); const result = _.map(_.keys(group), i => { return { area: i, count: _.map(group[i], j => { return { [j.data.substring(0, 7)]: { [j.val]: j.count } } }) } }) console.log('result', result) <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>Esta es una solución simple de JS.
const response = [{ area: "Z", val: "work", count: 12, data: "2022-03-01T00:00:00" }, { area: "Z", val: "not work", count: 41, data: "2022-04-01T00:00:00" }, { area: "R", val: "work", count: 55, data: "2022-03-01T00:00:00" }, { area: "R", val: "not work", count: 62, data: "2022-04-01T00:00:00" } ]; const groupBy = (arr, key) => { const initialValue = {}; return arr.reduce((acc, cval) => { const myAttribute = cval[key]; acc[myAttribute] = [...(acc[myAttribute] || []), cval] return acc; }, initialValue); }; const group = groupBy(response, 'area'); const result = Object.keys(group).map(i => { return { area: i, count: group[i].map(j => { return { [j.data.substring(0, 7)]: { [j.val]: j.count } } }) } }) console.log(result)