将 {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;
}())