js flattening conversion to tree structure array

js flattening conversion to tree structure array 1. Flatten data ---- > tree structure

1. Flat data ---- > tree structure (data)

	const data = [
		{
    
     id: 1, name: '小王' },
		{
    
     id: 12, name: '小黑', parentId: 1 },
		{
    
     id: 121, name: '小白', parentId: 12 },
		{
    
     id: 122, name: '小张', parentId: 12 },
		{
    
     id: 2, name: '小张' },
		{
    
     id: 22, name: '小刘', parentId: 2 },
		{
    
     id: 221, name: '小明', parentId: 22 },
		{
    
     id: 222, name: '小孙', parentId: 22 },
	]

2. Flat data ---- > The tree structure code is as follows

1. Import library

1. The code is as follows (flat data ---- > tree structure 1 example):

	/**
	* 扁平化数据 ---- > 树形结构1
	* @param pre: any, curr: any, i, arr
	* @returns 
	*/
	const newData11 = data.reduce(function (pre: any, curr: any, i, arr) {
    
    
		curr.children = arr.filter(v => v.parentId === curr.id)
		if (!curr.parentId) {
    
    
			pre.push(curr)
		}
		return pre
	}, [])
	console.log('newData', newData11);

2. The code is as follows (flat data ---- > tree structure 2 example):

	/**
	* 扁平化数据 ---- > 树形结构2
	* @param list 
	* @returns 
	*/
	const listToTree = (list) => {
    
    
		let info = list.reduce((map, node) => (map[node.id] = node, node.children = [], map), {
    
    })
		return list.filter(node => {
    
    
			info[node.parentId] && info[node.parentId].children.push(node)
			return !node.parentId
		})
	}
	console.log('newData', listToTree(data));

3. The code is as follows (flat data ---- > tree structure 3 example):

	/**
	* 扁平化数据 ---- > 树形结构3
	* @param data 
	* @returns 
	*/
	function transTree(data) {
    
    
		let result: any = []
		let map = {
    
    }
		if (!Array.isArray(data)) {
    
    //验证data是不是数组类型
			return []
		}
		data.forEach(item => {
    
    //建立每个数组元素id和该对象的关系
			map[item.id] = item //这里可以理解为浅拷贝,共享引用
		})
		data.forEach(item => {
    
    
			let parent = map[item.parentId] //找到data中每一项item的爸爸
			if (parent) {
    
    //说明元素有爸爸,把元素放在爸爸的children下面
				(parent.children || (parent.children = [])).push(item)
			} else {
    
    //说明元素没有爸爸,是根节点,把节点push到最终结果中
				result.push(item) //item是对象的引用
			}
		})
		return result //数组里的对象和data是共享的
	}
	console.log(transTree(data))

Guess you like

Origin blog.csdn.net/weixin_43138550/article/details/129046278