最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

jquery - Initialize a JavaScript object "tree" to any depth, nested objects - Stack Overflow

programmeradmin2浏览0评论

Essentially my I am trying to initialize a JavaScript object and have it contain empty objects with a single key. For example:

getOject('one.two.three')

Would result in the object:

{one:{two:{three:''}}}

As far as I can tell, you can't initialize with dynamic key names unless you use array notation

root[dynamicKey] = 'some variable';

so I need to loop through and based on the number of args initialize each one then assign it's value but the syntax doesn't seem to let me do this in any way that I know of.

So, if it were not a loop it would be like this:

jsonifiedForm[rootKey] = {};
jsonifiedForm[rootKey][childKeys[0]] = {};
jsonifiedForm[rootKey][childKeys[0]][childKeys[1]] = $input.val();

I can't think of a way to do this, I am not typically a JS guy so it might be something simple but I couldn't find anything on Google or Stack Overflow

Thank you in advance!

Essentially my I am trying to initialize a JavaScript object and have it contain empty objects with a single key. For example:

getOject('one.two.three')

Would result in the object:

{one:{two:{three:''}}}

As far as I can tell, you can't initialize with dynamic key names unless you use array notation

root[dynamicKey] = 'some variable';

so I need to loop through and based on the number of args initialize each one then assign it's value but the syntax doesn't seem to let me do this in any way that I know of.

So, if it were not a loop it would be like this:

jsonifiedForm[rootKey] = {};
jsonifiedForm[rootKey][childKeys[0]] = {};
jsonifiedForm[rootKey][childKeys[0]][childKeys[1]] = $input.val();

I can't think of a way to do this, I am not typically a JS guy so it might be something simple but I couldn't find anything on Google or Stack Overflow

Thank you in advance!

Share Improve this question edited Sep 24, 2014 at 20:03 njfife asked Sep 23, 2014 at 22:19 njfifenjfife 3,5751 gold badge23 silver badges32 bronze badges 1
  • 1 jsonifiedForm[rootKey] = {[childKeys[0]]: {[childKeys[1]] : $input.val() }} works in ES6. Until then, assuming you're coding for the browser what you have is about as good as it gets( assuming you're looping it). – Benjamin Gruenbaum Commented Sep 23, 2014 at 22:23
Add a ment  | 

2 Answers 2

Reset to default 5

This function should be what you're looking for.

function getOject(str) {
    // this turns the string into an array = 'one.two.three' bees ['one', 'two', 'three']
    var arr = str.split('.');

    // this will be our final object
    var obj = {};

    // this is the current level of the object - in the first iteration we will add the "one" object here
    var curobj = obj;

    var i = 0;
    // we loop until the next-to-last element because we want the last element ("three") to contain an empty string instead of an empty object
    while (i < (arr.length-1)) {
        // add a new level to the object and set the curobj to the new level
        curobj[arr[i]] = {};
        curobj = curobj[arr[i++]];
    }
    // finally, we append the empty string to the final object
    curobj[arr[i]] = '';
    return obj;
}

Because JavaScript references values in variables instead of copying them "into" variables, we can make our initial value, then make a reference to it which we'll move around as we delve down in:

var getOject = function (k, s) {
        // initialize our value for return
    var o = {},
        // get a reference to that object
        r = o,
        i;

    // we'll allow for a string or an array to be passed as keys,
    //and an optional sepeartor which we'll default to `.` if not given
    if (typeof k === 'string') {
        k = k.split(s || '.');
    }

    // do we have an array now?
    if (k && k.length) {
        //iterate it
        for (i = 0; i < k.length; i += 1) {
            // set a property on the referenced object
            r[k[i]] = {};
            // point the reference to the new level
            r = r[k[i]];
        }
    }

    // send back the object
    return o;
}

console.log(getOject('one.two.three'));
console.log(getOject('four|five|six', '|'));

r points to the same thing that o does, initially, and as we move the reference (r) deeper into o and write to it, we're building out o as we go.

The two console.log() calls at the end output the following:

Also notice I let you pass in an array to start with if you feel like it, and made the separator a parameter so that you're not stuck with .

发布评论

评论列表(0)

  1. 暂无评论