将一个数组结构的数据转为一个树形结构

emmmm题目的大概意思就是将下列数据:

  var data = [{
      parentId: 0, id: 1, value: '1' }, {
      parentId: 3, id: 2, value: '2' }, {
      parentId: 0, id: 3, value: '3' }, {
      parentId: 1, id: 4, value: '4' }, {
      parentId: 1, id: 5, value: '5' }]

转为这样的一个结构的数据:

[
        {
     
            id: 0,
            childrens: [
                {
     
                    parentId: 0,
                    id: 1,
                    value: '1',
                    childrens: [
                        {
     
                            parentId: 1,
                            id: 4,
                            value: '4'
                        },
                        {
     
                            parentId: 1,
                            id: 5,
                            value: '5'
                        }
                    ]
                },
                {
     
                    parentId: 0,
                    id: 3,
                    value: '3',
                    childrens: [
                        {
     
                            parentId: 3,
                            id: 2,
                            value: '2'
                        }
                    ]
                }]
        }
    ]

大概的意思就是这样

怎么做呢?最low的方式就是递归构建树嘛(哈哈哈,我也只会这种最low的)。

思路:观察上面的数据发现:肯定会有一个顶层的父节点。那么只要以这个父节点为基础去找他的孩子。如果找到孩子就以孩子去找孙子…直到一个树遍历结束那么,数的机构的构建的完成了。

话不多说上代码。

function toTree(data) {
		// 以这个节点为基础节点
        const tree = [
            {
                id: 0,
                childrens: []
            }
        ]
        // 找孩子
        function makeTree(tree, nodes) {
            for (let i = 0; i < tree.length; i += 1) {
                for (let j = 0; j < nodes.length; j += 1) {
                    if (tree[i].id === nodes[j].parentId) {
                        if (!tree[i].childrens) {
                            tree[i].childrens = [nodes[j]];
                        } else {
                            tree[i].childrens.push(nodes[j]);
                        }
                        nodes.splice(j, 1);
                        // 找孩子或者孙子......
                        makeTree(tree[i].childrens, nodes);
                    }
                }

            }
            return tree;
        }
        // JSON.parse(JSON.stringify(data)) 简单的深拷贝一个对象 反之函数内部改变形参导致外部传进来的实参发生改变。
        return makeTree(tree, JSON.parse(JSON.stringify(data)));
    }

好像挺简单的但是我当时就是没有做出来。太菜了。。。。。。。。

你可能感兴趣的:(我的面试整理)