Así que tengo un Objeto de dos matrices que estaba tratando de combinar.
Lo que pretendo hacer esencialmente es obtener los tipos únicos de dataOne. Luego necesito el recuento total de ocurrencias para cada tipo. Luego, necesito saber para cada tipo el conteo total de éxitos y fallas.
Luego, desde dataTwo, necesito incluir la cantidad de clics para cada tipo.
De momento tengo el siguiente que lo consigue, aunque seguro que se puede arreglar.
const ob = { "dataOne": [ { "type": "Type 1", "name": "failed" }, { "type": "Type 1", "name": "success" }, { "type": "Type 2", "name": "success" }, { "type": "Type 3", "name": "success" }, ], "dataTwo": [ { "type": "Type 1", "name": "click", }, { "type": "Type 2", "name": "click", }, { "type": "Type 2", "name": "click", }, { "type": "Type 1", "name": "click", }, { "type": "Type 3", "name": "click", }, ] }; const dataOneReduced = ob.dataOne.reduce((acc, o) => { if (!acc[o.type]) { acc[o.type] = [ { count: 0, success: 0, failed: 0, click: 0, }, ]; } acc[o.type][0]["count"] = (acc[o.type][0]["count"] || 0) + 1; acc[o.type][0][o.name] = acc[o.type][0][o.name] + 1; return acc; }, {}); const result = ob.dataTwo.reduce((acc, o) => { acc[o.type][0][o.name] = acc[o.type][0][o.name] + 1; return acc; }, dataOneReduced); console.log(result);Lo que estoy tratando de hacer ahora es insertar la tasa de éxito como un porcentaje. Así que necesito que la salida sea así
{ "Type 1": [ { "count": 2, "success": 1, "failed": 1, "click": 2, "successPecentage": 50 } ], "Type 2": [ { "count": 1, "success": 1, "failed": 0, "click": 2, "successPecentage": 100 } ], "Type 3": [ { "count": 1, "success": 1, "failed": 0, "click": 1, "successPecentage": 100, } ] }¿Cómo lograría esto?
Gracias
El objetivo deseado se puede lograr agregando una línea: acc[o.type][0].successPercentage = Math.round(acc[o.type][0].success / acc[o.type][0].count * 100); como se muestra en el siguiente fragmento
Fragmento de código
const ob = { "dataOne": [ { "type": "Type 1", "name": "failed" }, { "type": "Type 1", "name": "success" }, { "type": "Type 2", "name": "success" }, { "type": "Type 3", "name": "success" }, ], "dataTwo": [ { "type": "Type 1", "name": "click", }, { "type": "Type 2", "name": "click", }, { "type": "Type 2", "name": "click", }, { "type": "Type 1", "name": "click", }, { "type": "Type 3", "name": "click", }, ] }; const dataOneReduced = ob.dataOne.reduce((acc, o) => { if (!acc[o.type]) { acc[o.type] = [ { count: 0, success: 0, failed: 0, click: 0, }, ]; } acc[o.type][0]["count"] = (acc[o.type][0]["count"] || 0) + 1; acc[o.type][0][o.name] = acc[o.type][0][o.name] + 1; return acc; }, {}); const result = ob.dataTwo.reduce((acc, o) => { acc[o.type][0][o.name] = acc[o.type][0][o.name] + 1; acc[o.type][0].successPercentage = Math.round(acc[o.type][0].success / acc[o.type][0].count * 100); return acc; }, dataOneReduced); console.log(result);Puede recorrer su objeto una vez más e insertar el porcentaje. No es la mejor solución en cuanto a rendimiento, pero es más simple.
const ob = { "dataOne": [ { "type": "Type 1", "name": "failed" }, { "type": "Type 1", "name": "success" }, { "type": "Type 2", "name": "success" }, { "type": "Type 3", "name": "success" }, ], "dataTwo": [ { "type": "Type 1", "name": "click", }, { "type": "Type 2", "name": "click", }, { "type": "Type 2", "name": "click", }, { "type": "Type 1", "name": "click", }, { "type": "Type 3", "name": "click", }, ] }; const dataOneReduced = ob.dataOne.reduce((acc, o) => { if (!acc[o.type]) { acc[o.type] = [ { count: 0, success: 0, failed: 0, click: 0, }, ]; } acc[o.type][0]["count"] = (acc[o.type][0]["count"] || 0) + 1; acc[o.type][0][o.name] = acc[o.type][0][o.name] + 1; return acc; }, {}); const result = ob.dataTwo.reduce((acc, o) => { acc[o.type][0][o.name] = acc[o.type][0][o.name] + 1; return acc; }, dataOneReduced); for (const type of Object.keys(result)) { const obj = result[type][0]; obj.successPercentage = obj.success / obj.count * 100; } console.log(result); Puede insertar el cálculo directamente en .reduce() , y funcionará bien porque solo el valor se sobrescribirá con cada iteración, y solo el último valor correcto estará en la salida.
const ob = { "dataOne": [ { "type": "Type 1", "name": "failed" }, { "type": "Type 1", "name": "success" }, { "type": "Type 2", "name": "success" }, { "type": "Type 3", "name": "success" }, ], "dataTwo": [ { "type": "Type 1", "name": "click", }, { "type": "Type 2", "name": "click", }, { "type": "Type 2", "name": "click", }, { "type": "Type 1", "name": "click", }, { "type": "Type 3", "name": "click", }, ] }; const dataOneReduced = ob.dataOne.reduce((acc, o) => { if (!acc[o.type]) { acc[o.type] = [ { count: 0, success: 0, failed: 0, click: 0, }, ]; } acc[o.type][0]["count"] = (acc[o.type][0]["count"] || 0) + 1; acc[o.type][0][o.name] = acc[o.type][0][o.name] + 1; acc[o.type][0].successPercentage = acc[o.type][0].success / acc[o.type][0].count * 100; return acc; }, {}); const result = ob.dataTwo.reduce((acc, o) => { acc[o.type][0][o.name] = acc[o.type][0][o.name] + 1; return acc; }, dataOneReduced); console.log(result);