2012-01-08 10 views
10

Estoy planeando utilizar rutas materializadas en MongoDB para representar un árbol y necesito convertir las rutas materializadas de nuevo en un árbol JSON.Construir un árbol JSON desde rutas materializadas

ex. // Materializadas ruta

var input = [ 
    {"id": "0", "path": "javascript" }, 
    {"id": "1", "path": "javascript/database" }, 
    {"id": "2", "path": "javascript/database/tree" }, 
    {"id": "3", "path": "javascript/mvc" }, 
    {"id": "4", "path": "javascript/mvc/knockout.js"}, 
    {"id": "5", "path": "javascript/mvc/backbone.js"}, 
    {"id": "6", "path": "c++" }, 
    {"id": "7", "path": "c++/c0xx"}, 
    {"id": "8", "path": "c++/c0xx/lambda expressions"}, 
    {"id": "9", "path": "c++/c0xx/vc10" } 
]; 

El resultado sería:

[ 
    { 
     "id": "0", 
     "name": "javascript", 
     "children": [ 
      { 
       "id": "1", 
       "name": "database", 
       "children": [ 
        { 
         "id": "2", 
         "name": "tree", 
         "children": [] 
        } 
       ] 
      }, 
      { 
       "id": "3", 
       "name": "mvc", 
       "children": [ 
        { 
         "id": "4", 
         "name": "knockout.js", 
         "children": [] 
        }, 
        { 
         "id": "5", 
         "name": "backbone.js", 
         "children": [] 
        } 
       ] 
      } 
     ] 
    }, 
    { 
     "id": "6", 
     "name": "c++", 
     "children": [ 
      { 
       "id": "7", 
       "name": "c0xx", 
       "children": [ 
        { 
         "id": "8", 
         "name": "lambda expressions", 
         "children": [] 
        }, 
        { 
         "id": "9", 
         "name": "vc10", 
         "children": [] 
        } 
       ] 
      } 
     ] 
    } 
] 

He encontrado Convert delimited string into hierarchical JSON with JQuery que funciona muy bien.

Y también encontré Build tree from materialized path que está escrito en Ruby y usa recursividad. Estoy interesado y es curioso de ver esto implementado en Javascript y me pregunto si hay alguna persona que tenga fluidez en Ruby y Javascript a la que le gustaría reescribirla. Probé un conversor de Ruby a JS, pero el resultado fue incomprensible.

Gracias, Neville

Respuesta

3
var Comment = new Schema({ 
    date  : { 
     type  : Date, 
     default  : Date.now 
    }, 
    event: ObjectId, 
    body  : String, 
    pathComment : String, 
    user: Array 
}) 
Comment.virtual('level').get(function() { 
    return this.pathComment.split(',').length; 
}); 

Comment.find({event: event.id}).sort({pathComment:1}).exec(function(err, comment){ 

      var collectComment = function(comment){ 
       return { 
        body: comment.body, 
        event: comment.event, 
        pathComment: comment.pathComment, 
        id: comment._id, 
        level: comment.level, 
        user: comment.user[0], 
        date: comment.date, 
        comments: [] 
       }; 

      } 
      var tplComment = []; 

      var createChildComment = function(comment, currentNode, level){ 

       if(level==1){ 
        comment.push(collectComment(currentNode)); 
       }else{ 
        createChildComment(comment[comment.length-1]['comments'], currentNode,level-1); 
       } 
       return; 

      } 

      for(var k in comment){ 
       createChildComment(tplComment, comment[k],comment[k].level); 
      } 
}); 
+1

Gracias. Terminé usando el código de http://stackoverflow.com/questions/6232753/convert-delimited-string-into-hierarchical-json-with-jquery que funciona bien para mis necesidades. Algunos comentarios sobre cómo funciona el código serían bienvenidos. – nevf

Cuestiones relacionadas