js数组转树

34 阅读1分钟
const list = [
				{ id: 1, value: 1 },
				{ id: 2, value: 2, parentId: 1 },
				{ id: 3, value: 3, parentId: 1 },
				{ id: 4, value: 4, parentId: 2 },
				{ id: 5, value: 7, parentId: 4 },
			]
			const tree = {
				id: 1,
				value: 1,
				children: [
					{
						id: 2,
						value: 2,
						parentId: 1,
						children: [
							{
								id: 4,
								value: 4,
								parentId: 2,
								children: [
									{
										id: 5,
										value: 7,
										parentId: 4,
										children: [],
									},
								],
							},
						],
					},
					{
						id: 3,
						value: 3,
						parentId: 1,
						children: [],
					},
				],
			}

			function listToTree(list) {
				const tree = []
				const itemsMap = new Map()

				list.forEach(item => {
					itemsMap.set(item.id, {...item, children: []})
				})

				list.forEach(item => {
					const itemMap = itemsMap.get(item.id)
					if(!item.parentId) {
						tree.push(itemMap)
					} else {
						const parent = itemsMap.get(item.parentId)
						if(parent) {
							parent.children.push(itemMap)
						}
					}
				})

				return tree[0]
			}

			console.log(listToTree(list))