Jinto
Jinto

Reputation: 865

Create a nested object from a Javascript array

I have an array of object. Each item has a paret id mentioned. I want to create a nested object where it nesting goes on as much as the subcategories. Input and expected output given below. How can I achieve this with plain JS?

var inputArr = [
  {
    category_id: 1,
    parent_category_id: 3,
    title: "category1"
  },
  {
    category_id: 2,
    parent_category_id: 1,
    title: "category2"
  },
  {
    category_id: 3,
    title: "category3"
  },
  {
    category_id: 4,
    parent_category_id: 1,
    title: "category4"
  },
  {
    category_id: 5,
    parent_category_id: 2,
    title: "category5"
  }
]


var expectedOutput = {
  category_id: 3,
  title: "category3",
  subcategories: [
    {
      category_id: 1,
      subcategories: [
       {
         category_id: 2,
         title: "category2",
         subcategories: [
           {
             category_id: 5,
             title: "category5"
           }
         ]
       },
       {
         category_id: 4,
         title: "category4"
       }
      ]
    }
  ]
}

Upvotes: 1

Views: 97

Answers (1)

Kent Weigel
Kent Weigel

Reputation: 1178

var inputArr = [
    {
        category_id: 1,
        parent_category_id: 3,
        title: "category1"
    },
    {
        category_id: 2,
        parent_category_id: 1,
        title: "category2"
    },
    {
        category_id: 3,
        title: "category3"
    },
    {
        category_id: 4,
        parent_category_id: 1,
        title: "category4"
    },
    {
        category_id: 5,
        parent_category_id: 2,
        title: "category5"
    }
];

var temp = [];
var parent;

for (var i = 0; i < inputArr.length; i++) {
  
  if (temp[inputArr[i].category_id]) {
    Object.assign(temp[inputArr[i].category_id], inputArr[i]);
  } else {
    temp[inputArr[i].category_id] = inputArr[i];
    // uncomment the following assignment to add empty subcategories
    // array to leaf nodes for consistency.
    // temp[inputArr[i].category_id].subcategories = [];
  }

  var parentId = inputArr[i].parent_category_id;
  if (!parentId) {
    parent = temp[inputArr[i].category_id];  
  } else {
    if (!temp[parentId]) {
      temp[parentId] = {
        category_id: parentId,
        parent_category_id: undefined,
        title: undefined,
        subcategories: [temp[inputArr[i].category_id]]
      }
    } else {
      temp[parentId].subcategories = temp[parentId].subcategories || [];
      temp[parentId].subcategories.push(temp[inputArr[i].category_id]);
    }
  }
  
  delete temp[inputArr[i].category_id].parent_category_id;
}

temp = undefined;

document.write('<code><pre>' + JSON.stringify(parent, null, 2) + '</pre></code>');

Upvotes: 1

Related Questions