-1

I have an input object like:

[{
        "id": "123",
        "title": "Article 1",
        "evaluationLevel": {
            "levelName":A
        },
        "category": ["Category 1", "Category 2", "Category 3"]
    },
    {
        "id": "234",
        "title": "Article 2",
        "evaluationLevel": {
            "levelName":B 
        },
        "category": ["Category 2", "Category 4"]
    },
    {
        "id": "567",
        "title": "Article 3",
        "evaluationLevel": {
            "levelName":C
        },
        "category": ["Category 1"]
}]

My required output is:

{
   "Category 1": [
      ["1", "Article 1", A],
      ["2", "Article 3", C]

   ],
   "Category 2": [
      ["3", "Article 1", A],
      ["4", "Article 2", B]

   ],
   "Category 3": [
      ["5", "Article 1", A]

   ],
   "Category 4": [
      ["6", "Article 2", C]
   ]
}

Is there any cleaner way to group objects like this in javascript. I found a similar question in How to group an array of objects by key. The difference is I need to group object by values of category object.

user596502
  • 417
  • 3
  • 10
  • 22

1 Answers1

1

You can use array#reduce to group your array into categories. Once you have this object add the index to it.

let index = 0;
const data = [{ "id": "123", "title": "Article 1", "evaluationLevel": { "levelName": 'A' }, "category": ["Category 1", "Category 2", "Category 3"] }, { "id": "234", "title": "Article 2", "evaluationLevel": { "levelName": 'B' }, "category": ["Category 2", "Category 4"] },{ "id": "567", "title": "Article 3", "evaluationLevel": { "levelName": 'C' }, "category": ["Category 1"] }],
      result = data.reduce((r,o,i) => {
        o.category.forEach((category, j) => {
          r[category] = r[category] || [];
          r[category].push([o.title, o.evaluationLevel.levelName])
        });
        return r;
      },{}),
      output = Object.keys(result).reduce((r,k) => {
        result[k].forEach((item) => {
          index++;
          r[k] = r[k] || [];
          r[k].push([index, ...item]);
        });
        return r;
      }, {})
console.log(output);
Hassan Imam
  • 21,956
  • 5
  • 41
  • 51