数组数据转树数据, 树形数据转JQGRID数据

本文介绍了一种将数组形式的数据转换成树形结构的方法,并提供了一个辅助函数用于进一步处理树形数据,使其适用于如 jqGrid 等工具的展示需求。文章通过具体的 JavaScript 函数实现展示了如何构建树状数据结构及其子节点。
/**
    数组数据转树数据
    rows: 有 id 和 parentId, 比如 [{id: 1, parentId: null}, {id: 2, parentId: 1}]
    nodes: 返回数据 [{id: 1, parentId: null, children: [{id: 2, parentId: 1}]}]
*/
function list2tree(rows) {    
    if(sUtils.isNull(rows) || rows.length == 0) {
        return [];
    }
    // 判断有没有父节点
    function exists(rows, parentId) {
        for (var i = 0; i < rows.length; i++) {
            if (rows[i].id == parentId) return true;
        }
        return false;
    }
    // 找到 parentId = null的节点
    var nodes = [];
    for (var i = 0; i < rows.length; i++) {
        var row = rows[i];
        if (!exists(rows, row.parentId)) {
            // 复制数据,如果有 jquery ,则使用 $.extend 方法实现
            var obj = {};
            for (var key in row) {
                obj[key] = row[key];
            }
            obj['expanded'] = true;
            nodes.push(obj);
        }
    }
    var toDo = [];
    for (var i = 0; i < nodes.length; i++) {
        toDo.push(nodes[i]);
    }
    while (toDo.length) {
        var node = toDo.shift();
        for (var i = 0; i < rows.length; i++) {
            var row = rows[i];
            if (row.parentId == node.id) {
                var child = {};
                for (var key in row) {
                    child[key] = row[key];
                }
                if (node.children) {
                    node.children.push(child);
                } else {
                    node.children = [child];
                }
                toDo.push(child);
            }
        }
    }
    return nodes;
}


        function changeTreeDataFun(data) {
            var resData = [];
            var seqindex = 1;
            /** 判断是否为叶子节点,true: 是叶子节点, false: 不是叶子 */
            function isLeafFun(d) {
                if(d['children'] != null && d['children'].length > 0) {
                    return false;
                } 
                return true;
            }

            /** 生成 jqgrid 节点数据 */
            function createNewNode(d, level) {
                var newNode = {};
                for (var key in d) {
                    newNode[key] = d[key];
                }

                // 1. 是否叶子设置
                newNode['isLeaf'] = isLeafFun(d);
                // 2. 设置层
                newNode['level'] = level;
                // 5. 设置新 id
                newNode['seqindex'] = seqindex++;
                // 6. 清空 children
                newNode['children'] = null;
                return newNode;
            }

            // 递归
            function changeTreeChildDataFun(children, level) {
                for(var i=0; i< children.length; i++) {
                    var d = children[i];
                    var newNode = createNewNode(d, level);
                    if(!isLeafFun(d)) {
                        changeTreeChildDataFun(d['children'], (1 + level));
                    }
                    resData.push(newNode);
                }
            }
            changeTreeChildDataFun(data, 0);

            resData.sort(function (a, b) {
                return a['seqindex'] - b['seqindex'];
            });

            return resData;
        }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值