<html>
<body>
    <script type="text/javascript">
        const list = [
            { id: 1, name: '超级管理', parent_id: 0 },
            { id: 2, name: '用户管理', parent_id: 1 },
            { id: 3, name: '部门管理', parent_id: 1 },
            { id: 4, name: '日志管理', parent_id: 1 },
            { id: 5, name: '操作用户', parent_id: 2 },
            { id: 6, name: '查看用户', parent_id: 2 },
            { id: 7, name: '用户新增', parent_id: 5 },
            { id: 8, name: '用户删除', parent_id: 5 },
            { id: 9, name: '用户修改', parent_id: 5 },
            { id: 10, name: '操控部门', parent_id: 3 },
            { id: 11, name: '查看部门', parent_id: 3 },
            { id: 12, name: '部门新增', parent_id: 10 },
            { id: 13, name: '部门删除', parent_id: 10 },
            { id: 14, name: '部门修改', parent_id: 10 },
            { id: 15, name: '日志查看', parent_id: 4 },
            { id: 16, name: '日志导出', parent_id: 4 }
        ];
        /**
         * 树状的算法
         * @params list     代转化数组
         * @params parentId 起始节点
         */
        function getTrees(list, parentId) {
            let items = {};
            // 获取每个节点的直属子节点,*记住是直属,不是所有子节点
            for (let i = 0; i < list.length; i++) {
                let key = list[i].parent_id;
                if (items[key]) {
                    items[key].push(list[i]);
                } else {
                    items[key] = [];
                    items[key].push(list[i]);
                }
            }
            return formatTree(items, parentId);
        }

        /**
         * 利用递归格式化每个节点
         */
        function formatTree(items, parentId) {
            let result = [];
            if (!items[parentId]) {
                return result;
            }
            for (let t of items[parentId]) {
                t.children = formatTree(items, t.id)
                result.push(t);
            }
            return result;
        }


        var resultall = getTrees(list, 1);


        console.dir(resultall);
        console.log(JSON.stringify(resultall))
    </script>

</body>

</html>

第一个排在最后
b30d3c546d4051837a1fc096458fe1336b72d7a0.png
②加载完毕预制体完成后cc.instantiate

nit = () => {
     const self = this;
    cc.loader.loadRes('Test', cc.Prefab, (err, prefab) => {
  if (err) {
     cc.Log.e(err);
  } else {
    self.m_pPrefab = prefab;
  }
    });
};
cc.instantiate(this.m_pPrefab);

注意:实例化一次后面使用都是 cc.instantiate(this.m_pPrefab);

预制button 脚本button.js


cc.Class({
    extends: cc.Component,

    properties: {
    //给label标签挂载上来
        Text: {
            default: null,
            type: cc.Label
        },

    },
    // LIFE-CYCLE CALLBACKS:
    setLabelString: function (str) {
        //Label文字修改
        this.Text.string = (str);
    },


});

②代码调用

       var CanvasNode = this.node;//this.find()
    if (!CanvasNode) { cc.log('find Canvas error'); return; }
 cc.loader.loadRes('prefabs/button', function(errorMessage,loadedResource){
            //检查资源加载
            if( errorMessage ) { cc.log( '载入预制资源失败, 原因:' + errorMessage ); return; }
            if( !( loadedResource instanceof cc.Prefab ) ) { cc.log( '你载入的不是预制资源!' ); return; } 
            //开始实例化预制资源
            var TipBoxPrefab = cc.instantiate(loadedResource);
            //将预制资源添加到父节点
             CanvasNode.addChild(TipBoxPrefab);
            //获取预制资源中的js组件,并作出相应操作 button的js名字
            var TipBoxScript = TipBoxPrefab.getComponent('button');
            //开始操作JS组件脚本
            TipBoxScript.setLabelString("文字");
       });