user16865540
user16865540

Reputation:

Javascript entry duplicating in array with objects

I'm trying to filter a list of processes and group together processes with the same name. It works however the grouped processes are duplicated and stay as their own.

I have tried messing with how it does it, checking if it already exists in the object, and a dozen other things.

You can see the raw data I'm trying to process here

Here is the code I have so far:

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, "  "));

Here is the output from said code. Here is the expected output.

Either I'm missing something really simple or I'm just stupid. Probably both.

ps. I have no idea what to title this.

Upvotes: 2

Views: 52

Answers (1)

Rahul Sharma
Rahul Sharma

Reputation: 10071

The filter will not return your expected output, because it'll always return a data object from an existing array, not the one you created.

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, "  "));

Upvotes: 1

Related Questions