坑爹的数据结构 写了一个转换(已完成)

将  {LEVELINFO:"中国__江苏__南京",name:"江宁"},{LEVELINFO:"中国__江苏__浙江",name:"杭州"}....
将这样的数据格式转换为无限嵌套的数据格式 如下:

   

[
  	{
  		"name":"中国",
  		"list":[
  			{
  				"name":"江苏",
  				"list":[
  					{
  					    "name":"南京",
  					    "list":[
  					    	{"name":"江宁"},
  					    	{"name":"鼓楼"},
  					    	{"name":"浦口"}
  					    ]
  					},
  					{
  					    "name":"浙江",
  					    "list":[
  					    	{"name":"杭州"},
  					    	{"name":".."},
  					    	...
  					    ]
  					}
  				]
  			},
  			{
  				"name":"安徽",
  				"list":[...]
  			}
  		]
  	},
  	{
  		"name":"加拿大",
  		...
  	}
    
  ]

  代码如下:

(function(){
    var toJSON = function(data){
        var treeData={};
        treeData.data=[];
        for(var i=0,len=data.length; i<len; i++){
            var levelInfoArr = data[i].LEVELINFO.split("__");

            var obj = {};                                              
            var firstData;
            if(i==0){//i = 0, 创建初始层级
                obj = this.creatLevel(levelInfoArr,0,obj);
                treeData.data.push(obj.list[0]);
            }else{
                //在现有层级插入
                this.insertLevel(treeData.data,0,levelInfoArr);
            }
        }
        return treeData;
    }
    toJSON.prototype = {
        insertLevel: function(data,index,levelArr){
            var express = "";
            var indexArr = this.searchIndex(data,0,levelArr,[]);//获取插入层级
            for(var i=0,len=indexArr.length; i<len; i++){
                if(i==0){
                    express += "data[" + indexArr[0] + "]";
                }else{
                    express += ".list[" + indexArr[i] + "]";
                }
            }
            //console.log(express);

            //创建当前层级需要添加的子层级
            var insertObj;
            if(indexArr.length == levelArr.length){
                return;
            }else{
                insertObj = this.creatLevel(levelArr.slice(indexArr.length),0,{}).list[0];
                //console.log(insertObj);
            }

            //向当前层级插入子层级
            if(indexArr.length == 0){//新建第一层级
                data.push(insertObj);
            }else{
                (eval(express).list = eval(express).list || []).push(insertObj);
            }
        },

        searchIndex: function(data,index,levelArr,res){//flag:截止相同点
            var resObj = {};
            if(index != levelArr.length && data && data.length != 0){ //数组遍历完
                for(var i=0,len=data.length; i<len; i++){
                    if(data[i].name == levelArr[index]){//层级是否重复
                        res.push(i);
                        this.searchIndex(data[i].list,index+1,levelArr,res);
                    }
                }
            }
            return res;  //[0,1,0]
        },

        creatLevel: function(data,index,res){// data为当前层级数据
            var len = data.length;        
            var obj = {};
            if(len == 1){
                obj.name = data[index];
                (res.list = res.list || []).push(obj);
            }else if(index < len-1){
                obj.name = data[index];
                obj.list = []; 
                res.list = res.list || [];
                res.list.push(this.creatLevel(data,index+1,obj));
                
            }else if(index == len-1){
                obj.name = data[index];
                res.list.push(obj);
            }
            return res;
        }   
    
    }; 
    window.toJSON = toJSON;
}())

  

原文地址:https://www.cnblogs.com/jlliu/p/7744404.html