Estoy tratando de filtrar una lista de procesos y agrupar procesos con el mismo nombre. Funciona, sin embargo, los procesos agrupados se duplican y permanecen como propios.
He intentado jugar con cómo lo hace, comprobando si ya existe en el objeto y una docena de cosas más.
Puede ver los datos sin procesar que estoy tratando de procesar aquí
Aquí está el código que tengo hasta ahora:
var seen = {}; data = data.filter(async function (entry) { var previous; if (seen.hasOwnProperty(entry[1].name)) { previous = seen[entry[1].name]; var temp = JSON.parse(JSON.stringify(entry[1])); if (!previous[1]["grouped"]) { previous[1]["grouped"] = true; previous[1].pid = ""; previous[1].ppid = ""; previous[1].ctime = ""; previous[1].elapsed = ""; previous[1].timestamp = ""; previous[1]["subps"] = []; previous[1]["subps"].push(temp); } previous[1]["memory"] += entry[1].memory; previous[1]["cpu"] += entry[1].cpu; previous[1]["subps"].push(temp); return false; } else { seen[entry[1].name] = entry; return true; } }); console.log(JSON.stringify(data, null, " "));Aquí está la salida de dicho código. Aquí está el resultado esperado.
O me estoy perdiendo algo realmente simple o simplemente soy estúpido. Probablemente ambos.
PD. No tengo ni idea de que título poner a esto.
El filtro no devolverá el resultado esperado, porque siempre devolverá un objeto de datos de una matriz existente, no la que creó.
var data = [ [ "0", { cpu: 0, memory: 400150528, ppid: 4, pid: 3612, ctime: 8594, elapsed: 10784310, timestamp: 1641346226906, name: "Memory Compression", }, ], [ "1", { cpu: 0.2, memory: 336556032, ppid: 3012, pid: 1312, ctime: 61844, elapsed: 637176, timestamp: 1641346226906, name: "chrome.exe", }, ], [ "2", { cpu: 0.4, memory: 285069312, ppid: 7772, pid: 13172, ctime: 404125, elapsed: 2139440, timestamp: 1641346226906, name: "Code.exe", }, ], [ "3", { cpu: 6.6375, memory: 284061696, ppid: 5516, pid: 6636, ctime: 452234, elapsed: 4046397, timestamp: 1641346226906, name: "Discord.exe", }, ], [ "4", { cpu: 35.725, memory: 274665472, ppid: 15328, pid: 15232, ctime: 804718, elapsed: 1998606, timestamp: 1641346226906, name: "node.exe", }, ], [ "5", { cpu: 0, memory: 236437504, ppid: 14508, pid: 22016, ctime: 41828, elapsed: 316914, timestamp: 1641346226906, name: "Code.exe", }, ], [ "6", { cpu: 0.5875, memory: 231018496, ppid: 7772, pid: 14508, ctime: 53750, elapsed: 2130762, timestamp: 1641346226906, name: "Code.exe", }, ], [ "7", { cpu: 0, memory: 199610368, ppid: 2536, pid: 10656, ctime: 32469, elapsed: 10165205, timestamp: 1641346226906, name: "pia-client.exe", }, ], [ "8", { cpu: 0.975, memory: 193478656, ppid: 2536, pid: 3012, ctime: 144406, elapsed: 5764764, timestamp: 1641346226906, name: "chrome.exe", }, ], [ "9", { cpu: 0, memory: 186900480, ppid: 1104, pid: 8076, ctime: 8672, elapsed: 10140626, timestamp: 1641346226906, name: "SearchApp.exe", }, ], ]; const result = data.reduce((seen, [_, entry]) => { if (seen.hasOwnProperty(entry.name)) { var previous = seen[entry.name] ?? {}; // var temp = JSON.parse(JSON.stringify(entry)); if (!previous["grouped"]) { previous["grouped"] = true; previous.pid = ""; previous.ppid = ""; previous.ctime = ""; previous.elapsed = ""; previous.timestamp = ""; previous["subps"] = []; // For duplicate entries add here also, added in expected output previous["subps"] = [entry] } previous["memory"] += entry.memory; previous["cpu"] += entry.cpu; previous["subps"].push(entry); } else { seen[entry.name] = entry; } return seen; }, {}); console.log(JSON.stringify(Object.values(result), null, " "));