Sería más fácil si de alguna manera MUUCHO el1-EL4 se combinaron en un solo objeto, como
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'}
De esta forma, al menos puede recorrerlos rápidamente durante el procesamiento.
También sería útil saber por qué necesita tener esto almacenado como un árbol JSON. Quiero decir, no todos los nodos son del mismo tipo, ¿verdad? El primer nivel es continente, luego país, luego nombre del equipo, y las hojas son jugadores individuales de fútbol. Esa es una estructura de datos bastante confusa y no estoy seguro de cómo sería útil. De cualquier manera, puede ser más útil traducirlo en una estructura de campo primero y luego generar el árbol.
Edit: Bien, entonces lo pensé un poco más y creo que tal vez algo como esto pueda hacerlo.
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)
}
Esto crea un objeto de JavaScript. Te dejo convertir esto a JSON.
Actualización:
Sí, veo que la vieja escritura tendría que poner siempre un registro en el segundo nivel, incluso si ya existía. Esta es la nueva función FillTree mejorada:
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 })
}
La manera más fácil de convertir este objeto en JSON, al parecer, es utilizar JSON.stringify(tree)
aunque aparentemente esto no está uniformemente soportado (see the JavaScript JSON Page).
Gracias Jordan, pero Europa solo debe tener 2 hijos (España e Inglaterra) – user275031
@Dementic gracias! Si tiene una gran solución usted mismo, por favor publíquela. –
El código que escribí toma la entrada dada y crea exactamente la salida deseada. La única diferencia es que se genera como una estructura JavaScript, que el OP puede convertir a JSON utilizando el método que desee. En caso de que te lo estés preguntando, criticar de manera no constructiva la respuesta de otra persona no es una buena manera de motivarlos para que respondan a una de tus propias preguntas. –