2010-02-18 4 views
2
var array = [{"grandpa","father"}, {"father"}, {"grandpa","father","me"}]; 

Étant donné le tableau ci-dessus, je veux créer un objet java-script (JSON) comme ci-dessous, qui a la structure parent-enfant.Hiérarchie d'arborescence de construction Javascript

{"id":"grandpa", 
"children":[ 
    {"id":"father", 
    "children":[ 
     {"id":"me", 
     "children":[] 
     }] 
    }] 
} 
+0

Alors, quel est le problème? –

+0

Création de l'objet javascript en fonction du tableau – user275031

+0

Le tableau est une syntaxe non valide. – SLaks

Répondre

-2

Si vous souhaitez coder JSON, utilisez simplement une bibliothèque JSON.

N'essayez pas de rouler les vôtres.

+0

Lire la question - il n'essaie pas de coder les données JSON, il essaie de construire un arbre à partir d'une structure de données à plat. – Tex

7

Si vous demandez comment vous prendriez une liste de chemins de hiérarchie et de créer une structure arborescente, voici comment vous pouvez le faire en JavaScript:

function convertToHierarchy(arry /* array of array of strings */) 
{ 
    var item, path; 

    // Discard duplicates and set up parent/child relationships 
    var children = {}; 
    var hasParent = {}; 
    for (var i = 0; i < arry.length; i++) 
    { 
     var path = arry[i]; 
     var parent = null; 
     for (var j = 0; j < path.length; j++) 
     { 
      var item = path[j]; 
      if (!children[item]) { 
       children[item] = {}; 
      } 
      if (parent) { 
       children[parent][item] = true; /* dummy value */ 
       hasParent[item] = true; 
      } 
      parent = item; 
     } 
    } 

    // Now build the hierarchy 
    var result = []; 
    for (item in children) { 
     if (!hasParent[item]) { 
      result.push(buildNodeRecursive(item, children)); 
     } 
    } 
    return result; 
} 

function buildNodeRecursive(item, children) 
{ 
    var node = {id:item, children:[]}; 
    for (var child in children[item]) { 
     node.children.push(buildNodeRecursive(child, children)); 
    } 
    return node; 
} 

convertToHierarchy([["1","2"], ["1"], ["1","2","3"]]); 

Edit:

Votre question est toujours ambigu. Ma version précédente a pris ces deux choses:

  1. Chaque nœud ID identifiant de manière unique un nœud
  2. A spécifié chemin hiérarchique peut commencer à autre que le nœud racine

Dans cet exemple, je suppose les suivantes:

  1. ID nœud ne sont pas uniques, mais ils sont uniques dans les enfants d'un noeud particulier
  2. Tous les chemins hiérarchiques commencent au niveau du nœud racine de l'arbre

Voici le code:

function convertToHierarchy(arry /* array of array of strings */) 
{ 
    // Build the node structure 
    var rootNode = {id:"root", children:{}} 
    for (var i = 0; i < arry.length; i++) 
    { 
     var path = arry[i]; 
     buildNodeRecursive(rootNode, path, 0); 
    } 
    return rootNode; 
} 

function buildNodeRecursive(node, path, idx) 
{ 
    if (idx < path.length) 
    { 
     item = path[idx]; 
     if (!node.children[item]) 
     { 
      node.children[item] = {id:item, children:{}}; 
     } 
     buildNodeRecursive(node.children[item], path, idx + 1); 
    } 
} 

La structure hiérarchique est retourné, mais le format est un peu différent. Cependant, vous devriez obtenir l'image.

+0

Ouais je cherche ça. J'ai testé, cependant convertToHierarchy renvoie les enfants vides. – user275031

+0

Oups, oublié que pour .. ne fonctionne pas bien pour les tableaux.Vérifié cela fonctionne avec mes modifications. – Jacob

+0

Belle Jacob .. = D – user275031

0

Je pense que cela devrait fonctionner. J'utilise firebug pour suivre la structure de la sortie.

var el = {"name": "Level 1", "paths" : ["fruits"]}; 
    var el2 = {"name": "Level 3", "paths" : ["fruits", "apples", "fuji"]}; 
    var el3 = {"name": "Level 4", "paths" : ["fruits", "apples", "fuji", "red"]}; 
    var el4 = {"name": "Level 2", "paths" : ["fruits", "apples"]}; 

    var allEl = [el, el2, el3, el4]; 


    /* Define recursive function for setting the child */ 
    function setChild(parent, pos, arr, name) 
    { 
     if(pos < arr.length) 
     { 
      if(pos == arr.length-1) //last element of the paths 
       parent.name = name; 

      if(!parent.children){ 
       parent.children = []; 
       parent.children[0] = new Object(); 
      } 
      setChild(parent.children[0], pos + 1, arr, name); 
     } 
    } 

    /* Test starts here */ 
    var root = new Object(); 

    for(var i=0; i<allEl.length; i++) 
    { 
     var el = allEl[i]; 
     setChild(root, 0, el.paths, el.name); 
    } 

    //Firefox debugging ...getfirebug.com 
    console.debug(root); 
+0

Hmm, ne fonctionne pas pour les nœuds du même niveau .. var arr = ["fruits"]; var arr2 = ["fruits", "pommes", "fuji"]; var arr3 = ["fruits", "pommes"]; var arr4 = ["fruits", "pommes", "fuji", "rouge"]; var arr5 = ["fruits", "pommes", "fuji", "vert"]; – user275031