求教:高效的将数组结构(csv)的json转换成树状结构(tree)的办法?

bigbro001 2012-12-14 01:24:56
将形如这种结构的json数组:

[{"key1":"a", "key2":"b", "key3":"c"},
{"key1":"a", "key2":"b", "key3":"d", "key4":"e"},
{"key1":"a", "key2":"b", "key3":"f"}]

或者csv文件:
key1, key2, key3, key4 ...更多key
a, b, c,
a, b, d, e
a, b, f,

转换成形如下面的树状结构:

{
key1: "a",
children:
[
{key2: "b",
children:
[
{key3 : "c"},
{
key3 : "d",
children:
[
{key4:"e"}
]
},
{key3: "f"}
]}
]
}
...全文
684 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigbro001 2012-12-31
  • 打赏
  • 举报
回复
感谢各位提供思路,多谢楼上各位高手前辈
bigbro001 2012-12-28
  • 打赏
  • 举报
回复
发现一个高效的算法,供大家参考: https://github.com/mbostock/d3/wiki/Arrays#wiki-d3_nest

var nest = d3.nest()
    .key(function(d) { return d.key1; })
    .key(function(d) { return d.key2; })
    ...
    .entries(function(d) { return d.keyn; });
bigbro001 2012-12-15
  • 打赏
  • 举报
回复
多谢楼上各位前辈提供的思路,这两天好好看看,仔细研究研究
jeff_jiang 2012-12-14
  • 打赏
  • 举报
回复
引用 5 楼 q2979978 的回复:
引用 4 楼 wzs_xyz 的回复:前面代码有逻辑漏洞,修正如下: JavaScript code?12345678910111213141516171819202122232425262728function toTree(data,level,key) { var tree = []; if(!level) level = 1; for(var ……
啊。写错了- -。杯具 for(j in data[i]){}
jeff_jiang 2012-12-14
  • 打赏
  • 举报
回复
引用 4 楼 wzs_xyz 的回复:
前面代码有逻辑漏洞,修正如下: JavaScript code?12345678910111213141516171819202122232425262728function toTree(data,level,key) { var tree = []; if(!level) level = 1; for(var i=0;i<data.length;i……
目测lz所要的效果是key也是自定义的。应该用这个来找吧for(i in data[i]){}
未知数 2012-12-14
  • 打赏
  • 举报
回复
前面代码有逻辑漏洞,修正如下:

function toTree(data,level,key) {
    var tree = [];
    if(!level) level = 1;
    for(var i=0;i<data.length;i++) {
        var name = 'key'+level,mask = false;
        if(data[i][name]===undefined || data[i][name]===null) continue;
        if(data[i]['key'+(level-1)] && data[i]['key'+(level-1)]!==key) continue;
        for(var j=0;j<tree.length;j++) {
            if(data[i][name]==tree[j][name]) {
                mask = true;
                break;
            }

        }
        if(!mask) {
                var obj = {};
                obj[name] = data[i][name];
                obj.children = toTree(data,level+1,data[i][name]);
                if(obj.children.length<=0) delete obj.children;
                tree.push(obj);
        }
    }
    return tree;
}
var data=[{"key1":"a", "key2":"b", "key3":"c"},
{"key1":"a", "key2":"b", "key3":"d", "key4":"e"},
{"key1":"a", "key2":"b", "key3":"f"}];
var tree=toTree(data);
未知数 2012-12-14
  • 打赏
  • 举报
回复

function toTree(data,level) {
    var tree = [];
    if(!level) level = 1;
    for(var i=0;i<data.length;i++) {
        var name = 'key'+level,mask = false;
        if(data[i][name]===undefined || data[i][name]===null) continue;
        for(var j=0;j<tree.length;j++) {
            if(data[i][name]==tree[j][name]) {
                mask = true;
                break;
            }

        }
        if(!mask) {
                var obj = {};
                obj[name] = data[i][name];
                obj.children = toTree(data,level+1);
                if(obj.children.length<=0) delete obj.children;
                tree.push(obj);
        }
    }
    return tree;
}
var data=[{"key1":"a", "key2":"b", "key3":"c"},
{"key1":"a", "key2":"b", "key3":"d", "key4":"e"},
{"key1":"a", "key2":"b", "key3":"f"}];
var tree=toTree(data);//返回的tree为数组,tree[0]即为楼主所示的答案
jeff_jiang 2012-12-14
  • 打赏
  • 举报
回复
关键是这种数据格式太蛋疼了。建议楼主先转化成treeNode的一般模式,
function NodeObject(key,value,parentValue){
						this.key = key;
						this.value = value;
						this.parentValue = parentValue;//父节点唯一标识
					}{}
先转化成这种格式的就可以很容易的写出工具类转化成树了
吉普赛的歌 社区高级成员 T9 2012-12-14
  • 打赏
  • 举报
回复
你是要临时用一下, 还是希望可以通用的代码。 临时用一下, 可以: bejson 通用的话, 那得自己写了。 这个应该也不是什么很难吧。

87,992

社区成员

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

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