1

I have logs of json files which are objects that look like

{
  "logs": [
    {
      "id": "12321321321321",
      "email": "[email protected]",
      "message": "ahahaha"
    },
    {
      "id": "12321321312",
      "email": "[email protected]",
      "message": "hahahaha."
    },
   "id": "12321321321"
}

I need to return a new object that contains

{
    "hello_id": outer id of the json file,
    "array": [
       
       {
        "email": "[email protected]",
        "total": 2
       }
      ]
    }

So far I am looping through the json files and have

    jsonsInDirectory.forEach((file) => {
  const fileData = fs.readFileSync(path.join("./logs", file), "utf8");
  const jsonData = JSON.parse(fileData);
  }
});

The key is "logs" and "id" and the values are the objects in the "logs" and the value of "id"

How can I count and return a new object at the same time?

1
  • 1
    Your JSON struct is incorrect, your array isnt closed. Commented Jul 26, 2022 at 3:07

3 Answers 3

2

You can try this approach: make a hash object that counts emails. Then just map it to an array of objects.

const data = {
  logs: [{
      id: "89004ef9-e825-4547-a83a-c9e9429e8f95",
      email: "[email protected]",
      message: "successfully handled skipped operation."
    },
    {
      id: "89004ef9-e825-4547-a83a-c9e9429e8f95",
      email: "[email protected]",
      message: "successfully handled skipped operation."
    },
    {
      id: "89004ef9-e825-4547-a83a-c9e9429e8f95",
      email: "[email protected]",
      message: "successfully handled skipped operation."
    }],
  id: "56f83bed-3705-4115-9067-73930cbecbc0",
};

const emails = data.logs.reduce((acc, { email }) => {
  acc[email] = (acc[email] ?? 0) + 1;

  return acc;
}, {});

const tally = Object.entries(emails)
  .map(([email, total]) => ({ email, total }));
  
const result = { logs_id: data.id, tally };

console.log(result)
.as-console-wrapper { max-height: 100% !important; top: 0 }

Sign up to request clarification or add additional context in comments.

Comments

0

When you do const jsonData = JSON.parse(fileData);, you get the file data as a JSON and knowing the struct of that JSON you can easily get the info.

I have created a example https://codesandbox.io/s/stackoverflow-logs-count-example-jys2vg?file=/src/index.js

It may not solve exactly wath you want.

Comments

0

To solve this problem with the most time efficiency, you can create a tally object by firstly creating a map of the occurences of each mail with the email as the key and no of occurences as the value, since this will take constant (O(1)) time to execute, afterwhich you can create the tally array from the map as given below

output = []
jsonsInDirectory.forEach((file) => {
  const fileData = fs.readFileSync(path.join("./logs", file), "utf8");
  const jsonData = JSON.parse(fileData);
  var map = {}
  jsonData.logs.forEach((log) => {
    if(log.email in map){
        map[log.email] += 1
    }
    else {
        map[log.email] = 1
    }
  });
  var tally = []
  for(var email in map){
    tally.push({email: email, total: map[email]})
  }
  output.push({logs_id: jsonData['id'], tally: tally});
})

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.