2011-06-03 14 views
15

Tengo una matriz de cadenas que describen la relación padre/hijo al delimitarlas con guiones. Entonces, si el jefe de Bob era Jim y el jefe de Jim era Fred, la entrada de Bob en el conjunto sería "Fred-Jim-Bob" y la entrada de Jim sería "Fred-Jim". no tengo la capacidad de cambiar la forma en que los datos que entran en lo que estaba buscando ayuda en cuanto a la mejor manera de convertir estos valores en JSON similar a esto:Convertir cadena delimitada en JSON jerárquica con JQuery

{ 
    "name": "Fred", 
    "children": { 
     "name": "Jim", 
     "children": { 
      "name": "Bob" 
     } 
    } 
} 

cualquier ayuda se apreciado enormemente. Gracias. JSONifies

+0

le puede dar un ejemplo de la cadena de entrada? también, ¿baja a niveles infinitos, o está limitado a 3? – Jason

+0

Bueno, sería una serie de cadenas como las que se muestran arriba. Así que para el json que mencioné anteriormente la matriz podría ser: var emp = new Array ("Fred-Jim", "Fred", "Fred-Jim-Bob"); y sí podría ser más o menos de 3. – Munzilla

Respuesta

29
var input = ["Fred-Jim-Bob", "Fred-Jim", "Fred-Thomas-Rob", "Fred"]; 
var output = []; 
for (var i = 0; i < input.length; i++) { 
    var chain = input[i].split("-"); 
    var currentNode = output; 
    for (var j = 0; j < chain.length; j++) { 
     var wantedNode = chain[j]; 
     var lastNode = currentNode; 
     for (var k = 0; k < currentNode.length; k++) { 
      if (currentNode[k].name == wantedNode) { 
       currentNode = currentNode[k].children; 
       break; 
      } 
     } 
     // If we couldn't find an item in this list of children 
     // that has the right name, create one: 
     if (lastNode == currentNode) { 
      var newNode = currentNode[k] = {name: wantedNode, children: []}; 
      currentNode = newNode.children; 
     } 
    } 
} 

salida como:

[{ 
    "name": "Fred", 
    "children": [{ 
     "name": "Jim", 
     "children": [{ 
      "name": "Bob", 
      "children": [] 
     }] 
    }, { 
     "name": "Thomas", 
     "children": [{ 
      "name": "Rob", 
      "children": [] 
     }] 
    }] 
}] 
+0

Los comentarios OP dicen que debería funcionar para niveles infinitos. –

+1

La entrada de ejemplo tiene cadenas que van hasta 3 niveles, pero puede agregar más. Intenta cargar el ejemplo y haz que una de las cadenas diga '" Fred-Jim-Bob-Mark "'. Verás que funciona bien, también. El infinito matemático probablemente no funcionará, pero cualquier cosa dentro de límites razonables cuando se trate de la memoria del navegador debería funcionar. – Gijs

+0

Sí, estoy usando esto para analizar datos del organigrama de una compañía, así que no necesito niveles de INFINITE, pero estoy preparado para más de 3. – Munzilla

Cuestiones relacionadas