一道题引发的感想(无限分类)

233 阅读1分钟

无限分类递归 多数用在树形结构数据. 有这样一组数据:

简单实现如下

const arr = [
    {
        id: 4,
        name: '张三的儿子',
        parentId: 1
    },
    {
        id: 43,
        name: '张三的2儿子',
        parentId: 1
    },
    {
        id: 5,
        name: '李四的儿子',
        parentId: 2
    },
    {
        id: 6,
        name: '张三的儿子的儿子',
        parentId: 4
    },
    {
        id: 1,
        name: '张三',
        parentId: 0
    },
    {
        id: 2,
        name: '李四',
        parentId: 0
    },
    {
        id: 3,
        name: '王五',
        parentId: 0
    },
];

原本我的答案是递归,但是我一个激灵把他拍成了一次遍历

以下是我的答案,我实际上是利用对象的引用, 利用对象的引用改变指向的arr的数据. 就得到想要的结构

function cost(arr) {
	const sortArr = (a,b) => {
		if ( !obj[a.id] ) {
			obj[a.id] = a
			obj[a.id].children = []
		}
		if ( !obj[b.id] ) {
			obj[b.id] = b
			obj[b.id].children = []
		}
		return b.parentId - a.parentId
	}

	let obj = {
		0: {
			id: 0,
			name: 'root',
			children: [],
		}
	}

	return (arr.sort(sortArr).forEach(i=>obj[i.parentId].children.push(i)), obj[Object.keys(obj)[0]])
}
ps:遇到问题,先不要急着写代码,先想好思路,这样会很大程度避免弯路。



不管你是初级还是高级,只要你喜欢讨论技术,我都欢迎加QQ群讨论~
QQ群:615766495
Q群链接:前端FeNext