4

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?

1
  • YUI's JSON utility might be of help, I haven't put this as an answer though, because I couldn't tell you straight off the bat if it will cater to your needs. Or, come to think of it, check out YUI's augment utility, it merges objects I believe. Commented Sep 7, 2010 at 22:13

1 Answer 1

12
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
        }
    }
}*/
Sign up to request clarification or add additional context in comments.

1 Comment

Don't forget to use var: var i = 0, length = array.length

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.