从字符串层次结构创建JSON树 [英] Creating a JSON Tree from a string hierarchy
问题描述
鉴于这4个变量,
var el1 = {name:'ronaldo', team: 'europe/spain/realmadrid'}
var el2 = {name:'messi', team: 'europe/spain/barcelona'}
var el3 = {name:'gerald', team: 'europe/england/liverpool'}
var el4 = {name:'unknown english', team: 'europe/england'}
我需要生成这个JSON树层次结构,
I need to produce this JSON tree hierarchy,
{
"text":"europe",
"leaf":false,
"children":[
{
"text":"spain",
"leaf":false,
"children":[
{
"text":"realmadrid",
"leaf":false,
"children":[
{
"text":"ronaldo",
"leaf":true
}
]
},
{
"text":"barcelona",
"leaf":false,
"children":[
{
"text":"messi",
"leaf":true
}
]
}
]
},
{
"text":"england",
"leaf":false,
"children":[
{
"text":"unknown english",
"leaf":true
},
{
"text":"liverpool",
"leaf":false,
"children":[
{
"text":"gerald",
"leaf":true
}
]
}
]
}
]
}
推荐答案
它是如果el1-el4以某种方式组合成一个对象,就好了,比如
It'd be waaay easier if somehow el1-el4 were combined into a single object, like
var data = []
data[0] = {name:'ronaldo', team: 'europe/spain/realmadrid'}
data[1] = {name:'messi', team: 'europe/spain/barcelona'}
data[2] = {name:'gerald', team: 'europe/england/liverpool'}
data[3] = {name:'unknown english', team: 'europe/england'}
这样你至少可以在处理时快速循环它们。
That way you can at least loop through them quickly when processing.
了解为什么需要将其存储为JSON树也很有用。我的意思是,并非所有节点都是同一类型的东西,对吧?第一级是大陆,然后是国家,然后是球队名称,而叶子是单独的足球运动员。这是一个相当混乱的数据结构,我不确定它会如何有用。无论哪种方式,首先将其转换为现场结构然后生成树可能更有用。
It'd also be useful to know why you need to have this stored as a JSON Tree. I mean, not all the nodes are the same kind of thing, right? The first level is continent, then country, then team name, and the leaves are individual soccer players. That's a fairly confusing data structure and I'm not sure how it would be useful. Either way, it may be more useful to translate it into a fielded structure first and then generate the tree.
编辑:
好的,所以我想了一下,我想也许这样的事可能会这样做。
Okay, so I thought about it a bit more and I think maybe something like this may do it.
var data = [];
data[0] = {name:'ronaldo', team: 'europe/spain/realmadrid'};
data[1] = {name:'messi', team: 'europe/spain/barcelona'};
data[2] = {name:'gerald', team: 'europe/england/liverpool'};
data[3] = {name:'unknown english', team: 'europe/england'};
var tree = {};
function fillTree(name,steps) {
current = null;
for (var y = 0; y < steps.length; y++) {
if (y==0) {
if (!tree.children||typeof tree.children == 'undefined'){
tree = { text: steps[y], leaf: false, children: [] };
}
current = tree.children;
} else {
current.push({ text: steps[y], leaf: false, children: [] })
current = current[current.length - 1].children;
}
}
current.push({ text: name, leaf: true })
}
for (x=0; x < data.length; x++) {
steps =data[x].team.split('/');
fillTree(data[x].name,steps)
}
this创建一个JavaScript对象。我留给你把它转换成JSON。
This creates a JavaScript object. I leave it to you to convert this to JSON.
更新:
是的,我看到旧剧本总是会在第二级录制,即使它已经存在。这是新改进的FillTree函数:
Yeah, I see that the old script would have always put a record in at the second level even if it already existed. This is the new improved FillTree function:
var tree = {};
function fillTree(name,steps) {
var current = null,
existing = null,
i = 0;
for (var y = 0; y < steps.length; y++) {
if (y==0) {
if (!tree.children||typeof tree.children == 'undefined'){
tree = { text: steps[y], leaf: false, children: [] };
}
current = tree.children;
} else {
existing = null;
for (i=0; i < current.length; i++) {
if (current[i].text === steps[y]) {
existing = current[i];
break;
}
}
if (existing) {
current = existing.children;
} else {
current.push({ text: steps[y], leaf: false, children: [] });
current = current[current.length - 1].children;
}
}
}
current.push({ text: name, leaf: true })
}
显然,将此对象转换为JSON的最简单方法是使用 JSON.stringify(tree)
虽然显然没有统一支持(查看JavaScript JSON页面)。
The easiest way to convert this object into JSON, apparently, is to use JSON.stringify(tree)
although apparently this is not uniformly supported (see the JavaScript JSON Page).
这篇关于从字符串层次结构创建JSON树的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!