'Is there a way to convert a flat array of objects to a nested array of objects based on same name

I have an array of objects

[
    {"ID":1, "Category": "A", "SubCategory": "AA", "SubSubCategory":"AAA", "SubSubSubCategory":"foo"},
    {"ID":2, "Category": "A", "SubCategory": "AA", "SubSubCategory":"AAA", "SubSubSubCategory":"bar"},
    {"ID":3, "Category": "A", "SubCategory": "AA", "SubSubCategory":"AAB", "SubSubSubCategory":"foo"},
    {"ID":4, "Category": "A", "SubCategory": "AA", "SubSubCategory":"AAB", "SubSubSubCategory":"bar"},
    {"ID":5, "Category": "A", "SubCategory": "AB", "SubSubCategory":"ABB", "SubSubSubCategory":"foo"},
    {"ID":6, "Category": "A", "SubCategory": "AB", "SubSubCategory":"ABB", "SubSubSubCategory":"bar"},
    {"ID":7, "Category": "A", "SubCategory": "BB", "SubSubCategory":"BAA", "SubSubSubCategory":"foo"},
    {"ID":8, "Category": "A", "SubCategory": "BB", "SubSubCategory":"BAB", "SubSubSubCategory":"bar"},      
    {"ID":9, "Category": "B", "SubCategory": "AA", "SubSubCategory":"AAA", "SubSubSubCategory":"foo"},
    {"ID":10, "Category": "B", "SubCategory": "AA", "SubSubCategory":"AAA", "SubSubSubCategory":"bar"},
    {"ID":11, "Category": "B", "SubCategory": "AA", "SubSubCategory":"AAB", "SubSubSubCategory":"foo"},
    {"ID":12, "Category": "B", "SubCategory": "AA", "SubSubCategory":"AAB", "SubSubSubCategory":"bar"},
    {"ID":13, "Category": "B", "SubCategory": "AB", "SubSubCategory":"ABB", "SubSubSubCategory":"foo"},
    {"ID":14, "Category": "B", "SubCategory": "AB", "SubSubCategory":"ABB", "SubSubSubCategory":"bar"},
    {"ID":15, "Category": "B", "SubCategory": "BB", "SubSubCategory":"BAA", "SubSubSubCategory":"foo"},
    {"ID":16, "Category": "B", "SubCategory": "BB", "SubSubCategory":"BAB", "SubSubSubCategory":"bar"},
]

which i need to convert into an array of objects where objects having same category, subcategory, subsubcategory are nested, like -

[
    {
        "name":"A",
        "child": [
                    {
                        "name" : "AA",
                        "child" : [
                                    {
                                        "name" : "AAA",
                                        "child": [
                                                    {"name":"foo"},
                                                    {"name":"bar"}
                                                ]
                                    },
                                    {
                                        "name" : "AAB",
                                        "child": [
                                                    {"name":"foo"},
                                                    {"name":"bar"}
                                                ]
                                    }
                                ]
                    },
                    {
                        "name" : "AB",
                        "child" : [
                                    {
                                        "name" : "ABB",
                                        "child": [
                                                    {"name":"foo"},
                                                    {"name":"bar"}
                                                ]
                                    }
                                ]
                    },
                    {
                        "name" : "BB",
                        "child" : [
                                    {
                                        "name" : "BAA",
                                        "child": [
                                                    {"name":"foo"}
                                                ]
                                    },
                                    {
                                        "name" : "BAB",
                                        "child": [
                                                    {"name":"bar"}
                                                ]
                                    }
                                ]
                    }
                ]
    },
    {
        "name":"B",
        "child": [
                    {
                        "name" : "AA",
                        "child" : [
                                    {
                                        "name" : "AAA",
                                        "child": [
                                                    {"name":"foo"},
                                                    {"name":"bar"}
                                                ]
                                    },
                                    {
                                        "name" : "AAB",
                                        "child": [
                                                    {"name":"foo"},
                                                    {"name":"bar"}
                                                ]
                                    }
                                ]
                    },
                    {
                        "name" : "AB",
                        "child" : [
                                    {
                                        "name" : "ABB",
                                        "child": [
                                                    {"name":"foo"},
                                                    {"name":"bar"}
                                                ]
                                    }
                                ]
                    },
                    {
                        "name" : "BB",
                        "child" : [
                                    {
                                        "name" : "BAA",
                                        "child": [
                                                    {"name":"foo"}
                                                ]
                                    },
                                    {
                                        "name" : "BAB",
                                        "child": [
                                                    {"name":"bar"}
                                                ]
                                    }
                                ]
                    }
                ]
    }
] 

I am stuck here from last 2 days and not able to figure out a way to do it. I have gone through most of the similar questions but still not able to figure out a solution.

Any help would be appreciated. Thank you.



Solution 1:[1]

const arr = [
  { ID: 1, Category: 'A', SubCategory: 'AA', SubSubCategory: 'AAA', SubSubSubCategory: 'foo' },
  { ID: 2, Category: 'A', SubCategory: 'AA', SubSubCategory: 'AAA', SubSubSubCategory: 'bar' },
  { ID: 3, Category: 'A', SubCategory: 'AA', SubSubCategory: 'AAB', SubSubSubCategory: 'foo' },
  { ID: 4, Category: 'A', SubCategory: 'AA', SubSubCategory: 'AAB', SubSubSubCategory: 'bar' },
  { ID: 5, Category: 'A', SubCategory: 'AB', SubSubCategory: 'ABB', SubSubSubCategory: 'foo' },
  { ID: 6, Category: 'A', SubCategory: 'AB', SubSubCategory: 'ABB', SubSubSubCategory: 'bar' },
  { ID: 7, Category: 'A', SubCategory: 'BB', SubSubCategory: 'BAA', SubSubSubCategory: 'foo' },
  { ID: 8, Category: 'A', SubCategory: 'BB', SubSubCategory: 'BAB', SubSubSubCategory: 'bar' },
  { ID: 9, Category: 'B', SubCategory: 'AA', SubSubCategory: 'AAA', SubSubSubCategory: 'foo' },
  { ID: 10, Category: 'B', SubCategory: 'AA', SubSubCategory: 'AAA', SubSubSubCategory: 'bar' },
  { ID: 11, Category: 'B', SubCategory: 'AA', SubSubCategory: 'AAB', SubSubSubCategory: 'foo' },
  { ID: 12, Category: 'B', SubCategory: 'AA', SubSubCategory: 'AAB', SubSubSubCategory: 'bar' },
  { ID: 13, Category: 'B', SubCategory: 'AB', SubSubCategory: 'ABB', SubSubSubCategory: 'foo' },
  { ID: 14, Category: 'B', SubCategory: 'AB', SubSubCategory: 'ABB', SubSubSubCategory: 'bar' },
  { ID: 15, Category: 'B', SubCategory: 'BB', SubSubCategory: 'BAA', SubSubSubCategory: 'foo' },
  { ID: 16, Category: 'B', SubCategory: 'BB', SubSubCategory: 'BAB', SubSubSubCategory: 'bar' },
];
const result = arr.reduce((acc, curr) => {
  const { Category, SubCategory, SubSubCategory, SubSubSubCategory } = curr;
  const category = acc.find(x => x.name === Category);
  if (!category) {
    acc.push({
      name: Category,
      child: [
        {
          name: SubCategory,
          child: [
            {
              name: SubSubCategory,
              child: [{ name: SubSubSubCategory }],
            },
          ],
        },
      ],
    });
  } else {
    const subCategory = category.child.find(x => x.name === SubCategory);
    if (!subCategory) {
      category.child.push({
        name: SubCategory,
        child: [
          {
            name: SubSubCategory,
            child: [{ name: SubSubSubCategory }],
          },
        ],
      });
    } else {
      const subSubCategory = subCategory.child.find(x => x.name === SubSubCategory);
      if (!subSubCategory) {
        subCategory.child.push({
          name: SubSubCategory,
          child: [{ name: SubSubSubCategory }],
        });
      } else {
        subSubCategory.child.push({ name: SubSubSubCategory });
      }
    }
  }
  return acc;
}
  , []);
console.log(JSON.stringify(result, null, 2));

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Parvesh Kumar