Reputation: 865
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
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