views:

81

answers:

1

I have two arrays

["a", "b", "c"]
["a", "b", "d"]

I want to convert it to

{
    a :
    {
        b :
        {
            c : null,
            d : null
        }
    }
}

How can I do that?

+5  A: 
var tree = {}

function addToTree(tree, array) { 
   for (var i = 0, length = array.length; i < length; i++) {
       tree = tree[array[i]] = tree[array[i]] || {}
   }
}

addToTree(tree, ["a", "b", "c"])
addToTree(tree, ["a", "b", "d"])

/*{
    "a": {
        "b": {
            "c": {},
            "d": {}
        }
    }
}*/

Only thing it doesn't do is set the leaves of the tree to null -- it sets them to an empty object. Is that ok?

If you want the leaves to be null, then use the following instead:

function addToTree(tree, array) { 
    for (var i = 0, length = array.length; i < length; i++) {
        tree = tree[array[i]] = ((i == length - 1) ? null : tree[array[i]] || {})
    }
}

// or, without the i == length - 1 check in each iteration:
function addToTree(tree, array) { 
    for (var i = 0, length = array.length; i < length -1; i++) {
        tree = tree[array[i]] = tree[array[i]] || {};
    } 
    tree[array[i]] = null;
}

/*{
    "a": {
        "b": {
            "c": null,
            "d": null
        }
    }
}*/
CD Sanchez
Don't forget to use `var`: `var i = 0, length = array.length`
Marcel Korpel
@Marcel Korpel: Thanks, fixed.
CD Sanchez