Build a JSON tree from materialized paths
Asked Answered
U

1

12

I'm planning on using materialized paths in MongoDB to represent a tree and need to convert the materialized paths back into a JSON tree.

ex. // Materialized path

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

The result would be:

[
    {
        "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": []
                    }
                ]
            }
        ]
    }
]

I found Convert delimited string into hierarchical JSON with JQuery which works fine.

And I also found Build tree from materialized path which is written in Ruby and uses recursion. I'm interested and curious to see this implemented in Javascript and wonder whether there are any folks that are fluent in both Ruby and Javascript who would like to rewrite it. I did try a Ruby to JS converter, but the result was incomprehensible.

Thanks, Neville

Unequaled answered 8/1, 2012 at 22:35 Comment(0)
L
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);
            }
});
Lighterman answered 9/10, 2012 at 17:56 Comment(1)
Thanks. I ended up using the code from #6233253 which works fine for my needs. Some commentary on how the code works would be most welcome.Unequaled

© 2022 - 2024 — McMap. All rights reserved.