getNodeById的实现方式,即实现树的遍历查找

两种方式查找树节点:

递归和非递归-->

var node_ = {
    id:'1',
    text:'第一层',
    children:[{
        id:'2',
        text:'第二层1'
    },{
        id:'3',
        text:'第二层2',
        children:[{
            id:'4',
            text:'第三层1'
        },{
            id:'5',
            text:'第三层2',
            children:[{
                id:'6',
                text:'第四层1'
            }]
        }]
    }]
};

var getNodeHash = function(treeData){
    var root = treeData;
    var NodeHash  = {};//创建一个以节点id为键,节点信息为值的键值对
    NodeHash[root.id] = root;
    var iterator = root.children;
    var biter = [];
    while (iterator.length != 0) {
        for (var i = 0, len = iterator.length; i < len; i++) {
            var node = iterator[i];
            if(node){
                NodeHash[node.id] = node;
                biter = biter.concat(node.children);
            }
        }
        iterator = biter;
        biter = [];
    }
    return NodeHash;
};



var getHashNodes = {
    /**
     * node为对象{} 递归方式
     * @param node
     * @return {*}
     */
    create:function(node){
        var hashNode = {};
        hashNode[node.id] = node;
        node = node.children;
        function createHashNode(node){
            for(var i= 0,len=node.length;i<len;i++){
                hashNode[node[i].id] = node[i];
                if(node[i].children){
                    arguments.callee(node[i].children);
                }
            }
            return hashNode;
        }
        return createHashNode(node);
    }
};

console.log(getHashNodes.create(node_));
var hashNode_ = getNodeHash(node_);
console.log(hashNode_);
        var getNodeById = function(node,id){
            //先维护出nodeHash 创建nodeHash方法
            var hashNode = getHashNodes.create(node);
            return hashNode[id];
        }
     // console.log(getNodeById(node,'6').text);

这个是递归,之前写的:

var root = [{
        id:1,
        name:'根',
        getName:function(){
            return this.name;
        },
        items:[ {
                id:2,
                name:'c',
                getName:function(){
                    return this.name;
                },
                items:[{
                        id:4,
                        name:'44',
                        getName:function(){
                            return this.name;
                        }
                    }]
            },{
                id:3,
                name:'cc',
                getName:function(){
                    return this.name;
                }
            }]
    }];
//树形结构---递归方式
var obj = null;
function test(root, id) {
    for (var i = 0, len = root.length; i < len; i++) {
            if (root[i].id == id) {
                obj = root[i];
                break;
            }else{
                if (root[i].items) {
                    arguments.callee(root[i].items, id);
                }
            }
    }
   return obj;
}
//var s = test(root,1);//得到id为4的组件对象
//console.log(s.getName());//获取对象的name


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值