美文网首页
ztree把简单数据整理成子孙节点数据的算法学习

ztree把简单数据整理成子孙节点数据的算法学习

作者: 缓慢移动的蜗牛 | 来源:发表于2017-12-19 23:15 被阅读0次
    • 示例数据

    [
        { id:1, pId:0, name:"父节点1 "},
        { id:11, pId:1, name:"父节点11 "},
        { id:111, pId:11, name:"叶子节点111"},
        { id:112, pId:11, name:"叶子节点112"},
        { id:113, pId:11, name:"叶子节点113"},
        { id:114, pId:11, name:"叶子节点114"},
        { id:12, pId:1, name:"父节点12"},
        { id:121, pId:12, name:"叶子节点121"},
        { id:122, pId:12, name:"叶子节点122"},
        { id:123, pId:12, name:"叶子节点123"},
        { id:124, pId:12, name:"叶子节点124"},
        { id:13, pId:1, name:"父节点13 "},
        { id:2, pId:0, name:"父节点2"},
        { id:21, pId:2, name:"父节点21"},
        { id:211, pId:21, name:"叶子节点211"},
        { id:212, pId:21, name:"叶子节点212"},
        { id:213, pId:21, name:"叶子节点213"},
        { id:214, pId:21, name:"叶子节点214"},
        { id:22, pId:2, name:"父节点22 "},
        { id:221, pId:22, name:"叶子节点221"},
        { id:222, pId:22, name:"叶子节点222"},
        { id:223, pId:22, name:"叶子节点223"},
        { id:224, pId:22, name:"叶子节点224"},
        { id:23, pId:2, name:"父节点23"},
        { id:231, pId:23, name:"叶子节点231"},
        { id:232, pId:23, name:"叶子节点232"},
        { id:233, pId:23, name:"叶子节点233"},
        { id:234, pId:23, name:"叶子节点234"},
        { id:3, pId:0, name:"父节点3 "}
    ]
    
    • 整理成子孙节点的方法

    //定义一些变量
    var key='id',parentKey='pId',childKey='children';
    //具体方法
    function reconstruction(sNodes){
        var r = [];
        var tmpMap = {};
          
        //先把数组整理成map的形式
        for (i = 0, l = sNodes.length; i < l; i++) {
           // key为 对象的"id"的值, value就是就该对象
            tmpMap[sNodes[i][key]] = sNodes[i];
        }
          
       //遍历,组织成子孙节点
        for (i = 0, l = sNodes.length; i < l; i++) {
            //查找当前节点的父节点是否存在,如果存在就把当前节点放入到父节点的子孙列表中
            if (tmpMap[sNodes[i][parentKey]] && sNodes[i][key] != sNodes[i][parentKey]) {
                if (!tmpMap[sNodes[i][parentKey]][childKey])
                    tmpMap[sNodes[i][parentKey]][childKey] = [];
                tmpMap[sNodes[i][parentKey]][childKey].push(sNodes[i]);
            } else {
               //如果不存在就直接放入到一个新的列表中
                r.push(sNodes[i]);
            }
        }
        return r;
    }
    

    历来对数据进行排序大致有两种思想:以时间换空间,以空间换时间
    原来自己写的方法是采用循环遍历,数据量越大越慢,而且会导致浏览器崩溃
    此方法,速度就很快,只需要两遍遍历即可,典型的以空间换取时间

    相关文章

      网友评论

          本文标题:ztree把简单数据整理成子孙节点数据的算法学习

          本文链接:https://www.haomeiwen.com/subject/lghwwxtx.html