简体   繁体   中英

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" } ] } ] }

 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>');

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM