二维数组如何转树形结构数组呢?

1,770 阅读1分钟

## 题目 给定一个二维数组:

        [
            ['a', 'b'],
            ['a', 'c'],
            ['d', 'e', 'f'],
            ['d', 'e', 'g', 'h'],
            ['d', 'i']
        ]

转换成如下结构:

[
  {
    "name": "a",
    "child": [
      {
        "name": "b"
      },
      {
        "name": "c"
      }
    ]
  },
  {
    "name": "d",
    "child": [
      {
        "name": "e",
        "child": [
          {
            "name": "f"
          },
          {
            "name": "g",
            "child": [
              {
                "name": "h"
              }
            ]
          }
        ]
      },
      {
        "name": "i"
      }
    ]
  }
]

解决方案

//首先定义一个递归函数(tree:结果,value:当前的值,parent:父节点的值)
function arrpush  (tree, value, parent) {
        tree.forEach((item, index) => {
            if (item.name === parent) {
            //判断是不是第一层节点
                if (_.find(item.child, { name: value })) {
                    //存在当前节点跳过
                    return;
                } else {
                    //将节点放到当前节点的子节点里
                    item.child.push({
                        name: value,
                        child: []
                    });
                }
            } else {
                if (item.child.length > 0) {
                //子节点不为空的时候寻找节点的所属位置,递归调用
                    return this.arrpush(item.child, value, parent);
                }
            }
        });
    };
//定义app方法来进行结果的运算
 function app (array) {
        let tree = [];
        array.forEach((item, index) => {
        //第一层循环
            item.forEach((ite, ind) => {
            //第二层循环
                if (ind > 0) {
                    //不是第一个节点
                    this.arrpush(tree, ite, item[ind - 1]);
                } else {
                    //第一个节点
                    if (_.find(tree, { name: ite })) {
                        return;
                    } else {
                        tree.push({
                            name: ite,
                            child: []
                        });
                    }
                }
            });
        });
        console.log(tree);
    };
//运行app方法
    app([
            ['a', 'b'],
            ['a', 'c'],
            ['d', 'e', 'f'],
            ['d', 'e', 'g', 'h'],
            ['d', 'i']
        ]);

总结

首先考虑如何形成树形结构,父子之间的联系是什么。这里我用name当唯一标示。 考虑清楚联系,然后就是递归运算,要判断当前的节点存在与否。如果不判断一味添加,就会造成节点的重复。所以要有适当的过滤。