递归手动生成treepanel的子孙树节点

开发中的一个需求,需要将一个自关联的表取出数据后,反映到前台的ext树形式。由于鄙人对ext不怎么熟,或许不用下面这么麻烦实现子孙节点关系,但是开发时为了快速实现原型,才想到下面的方法,或许只是下策。

由于从后台取得的数据是List<Map>形式,一个map是一条数据,数据之间没有直接的子孙关系,
并且本地renderJson方法是将Map转化为json形式传递到前台,renderJson本身不会组织数据之间的子孙关系,然而ext构建树节点需要  [{id:'xx',text:'xxx',children:[{id:'xxx',text:'',leaf:true},{.....}]}] 这种形式。这种对象中有数组的形式导致我不得不转化数据,所以需要转化List<Map>中的数据,以便renderJson可以生成符合ext树节点json的形式。



下面是自己手动转化数据,在后台将数据转化为ext的树节点子孙关系结构。最后json形式传递到前台,生成treepanel子孙节点。感觉效率不怎么高,需要优化,也许我没想到更好的方法。
//yuyong 2012-3-14

//"select level,a.* from zzjg a start with a.id in (select id from zzjg where //super_id is null)\n" +
//                "connect by prior a.id=a.super_id\n" +
//                "order by level"
//categoryQuery.listAll()是通过上述迭代查询获取数据,讲父级节点查出置于前列。
 List<Map>lists=categoryQuery.listAll();
 List<Map>treeNodes=new ArrayList<Map>();
 while(lists.size()>0){
 for(Iterator iter=lists.iterator();iter.hasNext();){
		Map m= (Map) iter.next();
		if(m.get("PARENT_ID")==null ){
			Map map=new HashMap();
			map.put("id", toInteger(m.get("ID")));
			map.put("text", m.get("NAME"));
			map.put("path", m.get("PATH"));
			map.put("leaf", true);
			treeNodes.add(map);
			iter.remove();
		}
		else
			for(Map map:treeNodes){
				Map mapSon=new HashMap();
				mapSon.put("id", toInteger(m.get("ID")));
				mapSon.put("text", m.get("NAME"));
				mapSon.put("path", m.get("PATH"));
				if(appendChild(map,toInteger(m.get("PARENT_ID")),mapSon)){
					iter.remove();
					break;
				}
			}
	}
}
this.renderJson(treeNodes, resp);


//递归添加子节点,将子节点添加到父节点的children集合中
private boolean appendChild(Map map,Integer parentId,Map mapSon){
	if(((Integer)map.get("id")).intValue()==parentId.intValue()){
		if(map.get("children")==null){
			map.put("children", new ArrayList<Map>());
		}
		map.put("leaf", false);
		mapSon.put("leaf", true);
		((List<Map>)map.get("children")).add(mapSon);
			return true;
		}else{
			if(map.get("children")!=null){
				List<Map>lists=(List<Map>) map.get("children");
				for(Map m:lists){
					if(appendChild(m,parentId,mapSon))
						return true;
				}
			}
		}
	return false;
}


//yuyong 2012-3-14

这样传递到前台的数据就是[{id:'xx',text:'xxx',children:[{id:'xxx',text:'',leaf:true},{.....}]}] 的json形式了。



你可能感兴趣的:(json)