求问一个数据固定格式存储算法

南意长安 2017-11-11 12:38:01
请问如何把这种数据
"
北京市,海淀区,温泉镇;
湖南省,长沙市,岳麓区,郁林街;
广东省,广州市,雨花区;
"

存为const treeObj = {
text: '',
children: [
{
text: '北京',
children: []
}, {
text: '辽宁',
children: [
{
text: '沈阳',
children: [{
text: '和平区',
children: []
}]
}, {
text: '大连',
children: []
}
]
}
]
};
求大神帮忙解答,非常感谢。
...全文
308 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
南意长安 2017-11-16
  • 打赏
  • 举报
回复
引用 8 楼 functionsub 的回复:
[quote=引用 7 楼 LXIBEI 的回复:] [quote=引用 6 楼 LXIBEI 的回复:] [quote=引用 4 楼 functionsub 的回复:]
var str = "北京市,海淀区,温泉镇;湖南省,长沙市,岳麓区,郁林街;广东省,广州市,雨花区;北京市,海淀区,白家疃;"
var arr = str.split(';');
if(arr[arr.length - 1] == ''){
    arr.pop();
}
var tempMap = {};
function createChild(name,parent){
    if(tempMap[name]){
        return tempMap[name];
    }
    var obj = {};
    obj.text = name;
    obj.children = [];
    if(parent){
        parent.children.push(obj);
    }
    tempMap[name] = obj;
    return obj;
}
var treeObj = createChild('');
for(var i=0;i<arr.length;i++){
    var _arr = arr[i].split(',');
    var self,parent = treeObj;
    while(_arr.length){
        var name = _arr.shift();
        self = createChild(name,parent);
        parent = self;
    }
}
console.log(treeObj)
貌似还有个问题,比如有a,b,c;和f,b,d;他们的父级不一样,但是会把第二个的d合并到第一个b下面,而且第二个f下面就什么都没有了[/quote] 希望如果父级一样才合并子级,否则不合并[/quote]
var str = "北京市,海淀区,温泉镇;湖南省,长沙市,岳麓区,郁林街;广东省,广州市,雨花区;北京市,海淀区,白家疃;南京,海淀区,白家疃;"
var arr = str.split(';');
if(arr[arr.length - 1] == ''){
    arr.pop();
}
var tempMap = {};
function createChild(name,parent){
    var path = '';
    if(parent){
        path = getBranchPath(parent);
        path = path ? path + '.' + name : name;
        if(tempMap[path]){
            return tempMap[path];
        }
    }
    var obj = {};
    obj.text = name;
    obj.children = [];
    if(parent){
        obj.parent = parent;
        parent.children.push(obj);
    }
    path = getBranchPath(obj);
    tempMap[path] = obj;
    return obj;
}
function getBranchPath(obj){
    var path = [];
    path.push(obj.text);
    var parent = obj.parent;
    while(parent && parent.text){
        path.push(parent.text);
        parent = parent.parent;
    }
    return path.reverse().join('.');
}
var treeObj = createChild('');
for(var i=0;i<arr.length;i++){
    var _arr = arr[i].split(',');
    var self,parent = treeObj;
    while(_arr.length){
        var name = _arr.shift();
        self = createChild(name,parent);
        parent = self;
    }
}
for(var p in tempMap){
    delete tempMap[p].parent;
}
console.log(treeObj)
[/quote] 感谢
functionsub 2017-11-13
  • 打赏
  • 举报
回复
引用 7 楼 LXIBEI 的回复:
[quote=引用 6 楼 LXIBEI 的回复:] [quote=引用 4 楼 functionsub 的回复:]
var str = "北京市,海淀区,温泉镇;湖南省,长沙市,岳麓区,郁林街;广东省,广州市,雨花区;北京市,海淀区,白家疃;"
var arr = str.split(';');
if(arr[arr.length - 1] == ''){
    arr.pop();
}
var tempMap = {};
function createChild(name,parent){
    if(tempMap[name]){
        return tempMap[name];
    }
    var obj = {};
    obj.text = name;
    obj.children = [];
    if(parent){
        parent.children.push(obj);
    }
    tempMap[name] = obj;
    return obj;
}
var treeObj = createChild('');
for(var i=0;i<arr.length;i++){
    var _arr = arr[i].split(',');
    var self,parent = treeObj;
    while(_arr.length){
        var name = _arr.shift();
        self = createChild(name,parent);
        parent = self;
    }
}
console.log(treeObj)
貌似还有个问题,比如有a,b,c;和f,b,d;他们的父级不一样,但是会把第二个的d合并到第一个b下面,而且第二个f下面就什么都没有了[/quote] 希望如果父级一样才合并子级,否则不合并[/quote]
var str = "北京市,海淀区,温泉镇;湖南省,长沙市,岳麓区,郁林街;广东省,广州市,雨花区;北京市,海淀区,白家疃;南京,海淀区,白家疃;"
var arr = str.split(';');
if(arr[arr.length - 1] == ''){
    arr.pop();
}
var tempMap = {};
function createChild(name,parent){
    var path = '';
    if(parent){
        path = getBranchPath(parent);
        path = path ? path + '.' + name : name;
        if(tempMap[path]){
            return tempMap[path];
        }
    }
    var obj = {};
    obj.text = name;
    obj.children = [];
    if(parent){
        obj.parent = parent;
        parent.children.push(obj);
    }
    path = getBranchPath(obj);
    tempMap[path] = obj;
    return obj;
}
function getBranchPath(obj){
    var path = [];
    path.push(obj.text);
    var parent = obj.parent;
    while(parent && parent.text){
        path.push(parent.text);
        parent = parent.parent;
    }
    return path.reverse().join('.');
}
var treeObj = createChild('');
for(var i=0;i<arr.length;i++){
    var _arr = arr[i].split(',');
    var self,parent = treeObj;
    while(_arr.length){
        var name = _arr.shift();
        self = createChild(name,parent);
        parent = self;
    }
}
for(var p in tempMap){
    delete tempMap[p].parent;
}
console.log(treeObj)
南意长安 2017-11-13
  • 打赏
  • 举报
回复
引用 6 楼 LXIBEI 的回复:
[quote=引用 4 楼 functionsub 的回复:]
var str = "北京市,海淀区,温泉镇;湖南省,长沙市,岳麓区,郁林街;广东省,广州市,雨花区;北京市,海淀区,白家疃;"
var arr = str.split(';');
if(arr[arr.length - 1] == ''){
    arr.pop();
}
var tempMap = {};
function createChild(name,parent){
    if(tempMap[name]){
        return tempMap[name];
    }
    var obj = {};
    obj.text = name;
    obj.children = [];
    if(parent){
        parent.children.push(obj);
    }
    tempMap[name] = obj;
    return obj;
}
var treeObj = createChild('');
for(var i=0;i<arr.length;i++){
    var _arr = arr[i].split(',');
    var self,parent = treeObj;
    while(_arr.length){
        var name = _arr.shift();
        self = createChild(name,parent);
        parent = self;
    }
}
console.log(treeObj)
貌似还有个问题,比如有a,b,c;和f,b,d;他们的父级不一样,但是会把第二个的d合并到第一个b下面,而且第二个f下面就什么都没有了[/quote] 希望如果父级一样才合并子级,否则不合并
南意长安 2017-11-13
  • 打赏
  • 举报
回复
引用 4 楼 functionsub 的回复:
var str = "北京市,海淀区,温泉镇;湖南省,长沙市,岳麓区,郁林街;广东省,广州市,雨花区;北京市,海淀区,白家疃;"
var arr = str.split(';');
if(arr[arr.length - 1] == ''){
    arr.pop();
}
var tempMap = {};
function createChild(name,parent){
    if(tempMap[name]){
        return tempMap[name];
    }
    var obj = {};
    obj.text = name;
    obj.children = [];
    if(parent){
        parent.children.push(obj);
    }
    tempMap[name] = obj;
    return obj;
}
var treeObj = createChild('');
for(var i=0;i<arr.length;i++){
    var _arr = arr[i].split(',');
    var self,parent = treeObj;
    while(_arr.length){
        var name = _arr.shift();
        self = createChild(name,parent);
        parent = self;
    }
}
console.log(treeObj)
貌似还有个问题,比如有a,b,c;和f,b,d;他们的父级不一样,但是会把第二个的d合并到第一个b下面,而且第二个f下面就什么都没有了
南意长安 2017-11-11
  • 打赏
  • 举报
回复
引用 4 楼 functionsub 的回复:
var str = "北京市,海淀区,温泉镇;湖南省,长沙市,岳麓区,郁林街;广东省,广州市,雨花区;北京市,海淀区,白家疃;"
var arr = str.split(';');
if(arr[arr.length - 1] == ''){
    arr.pop();
}
var tempMap = {};
function createChild(name,parent){
    if(tempMap[name]){
        return tempMap[name];
    }
    var obj = {};
    obj.text = name;
    obj.children = [];
    if(parent){
        parent.children.push(obj);
    }
    tempMap[name] = obj;
    return obj;
}
var treeObj = createChild('');
for(var i=0;i<arr.length;i++){
    var _arr = arr[i].split(',');
    var self,parent = treeObj;
    while(_arr.length){
        var name = _arr.shift();
        self = createChild(name,parent);
        parent = self;
    }
}
console.log(treeObj)
感谢
functionsub 2017-11-11
  • 打赏
  • 举报
回复
var str = "北京市,海淀区,温泉镇;湖南省,长沙市,岳麓区,郁林街;广东省,广州市,雨花区;北京市,海淀区,白家疃;"
var arr = str.split(';');
if(arr[arr.length - 1] == ''){
    arr.pop();
}
var tempMap = {};
function createChild(name,parent){
    if(tempMap[name]){
        return tempMap[name];
    }
    var obj = {};
    obj.text = name;
    obj.children = [];
    if(parent){
        parent.children.push(obj);
    }
    tempMap[name] = obj;
    return obj;
}
var treeObj = createChild('');
for(var i=0;i<arr.length;i++){
    var _arr = arr[i].split(',');
    var self,parent = treeObj;
    while(_arr.length){
        var name = _arr.shift();
        self = createChild(name,parent);
        parent = self;
    }
}
console.log(treeObj)
南意长安 2017-11-11
  • 打赏
  • 举报
回复
引用 2 楼 functionsub 的回复:
哦,最后有个空的,把str最后的;去掉,或者在循环之前把arr数组最后一个元素删掉
有个问题。如果有重复的需要合并,比如还有一个“北京市,海淀区,白家疃;”就是如果父节点一样,只需要把子节点合并
functionsub 2017-11-11
  • 打赏
  • 举报
回复
哦,最后有个空的,把str最后的;去掉,或者在循环之前把arr数组最后一个元素删掉
functionsub 2017-11-11
  • 打赏
  • 举报
回复
var str = "北京市,海淀区,温泉镇;湖南省,长沙市,岳麓区,郁林街;广东省,广州市,雨花区;"
var arr = str.split(';');
function createChild(name,parent){
    var obj = {};
    obj.text = name;
    obj.children = [];
    if(parent){
        parent.children.push(obj);
    }
    return obj;
}
var treeObj = createChild('');
for(var i=0;i<arr.length;i++){
    var _arr = arr[i].split(',');
    var self,parent = treeObj;
    while(_arr.length){
        var name = _arr.shift();
        self = createChild(name,parent)
        parent = self;
    }
}
console.log(treeObj)

87,993

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧