2011-06-03 7 views
15

J'ai un tableau de chaînes décrivant la relation parent/enfant en étant délimité par des tirets. Donc, si le patron de Bob était Jim et que le patron de Jim était Fred, l'entrée de Bob dans le tableau serait "Fred-Jim-Bob" et l'entrée de Jim serait "Fred-Jim". Je n'ai pas la possibilité de changer la façon dont les données sont éclairait si je cherchais l'aide jusqu'à la meilleure façon de transformer ces valeurs en JSON semblable à ceci:Convertir une chaîne délimitée en JSON hiérarchique avec JQuery

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

Toute aide serait très appréciée. Merci.

+0

peut vous donner un exemple de la chaîne d'entrée? aussi, est-ce qu'il descend à des niveaux infinis, ou est-il limité à 3? – Jason

+0

Eh bien, ce serait un tableau de chaînes comme celles présentées ci-dessus. Donc, pour le json que j'ai mentionné ci-dessus, le tableau pourrait être: var emp = new Array ("Fred-Jim", "Fred", "Fred-Jim-Bob"); et oui, il pourrait être plus ou moins de 3. – Munzilla

Répondre

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; 
     } 
    } 
} 

JSONifies de sortie comme:

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

Les commentaires OP disent qu'il devrait fonctionner pour des niveaux infinis. –

+1

L'entrée d'exemple possède des chaînes pouvant aller jusqu'à 3 niveaux, mais vous pouvez en ajouter d'autres. Essayez de charger l'exemple et de faire l'une des chaînes dites «Fred-Jim-Bob-Mark». Vous verrez que cela fonctionne bien aussi. L'infinité mathématique ne sera probablement pas gérée, mais tout ce qui se trouve dans des limites raisonnables lorsque la mémoire du navigateur est concernée devrait fonctionner. – Gijs

+0

Oui, j'utilise ceci pour analyser les données de l'organigramme d'une entreprise, donc je n'ai pas besoin de niveaux INFINITE, mais préparé pour plus de 3. – Munzilla

Questions connexes