初始化一个JavaScript对象" tree"任何深度,嵌套对象

时间:2014-09-23 22:19:43

标签: javascript jquery arrays json

基本上我正在尝试初始化一个JavaScript对象并让它包含一个带有单个键的空对象。例如:

getOject('one.two.three')

会导致对象:

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

据我所知,除非使用数组表示法,否则无法使用动态键名进行初始化

root[dynamicKey] = 'some variable';

所以我需要循环并根据args的数量初始化每个,然后分配它的值,但语法似乎不允许我以我知道的任何方式执行此操作。

所以,如果它不是循环,那就像这样:

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

我无法想办法做到这一点,我通常不是一个JS人,所以它可能很简单,但我无法在Google或Stack Overflow上找到任何东西

提前谢谢!

2 个答案:

答案 0 :(得分:5)

此功能应该是您正在寻找的功能。

function getOject(str) {
    // this turns the string into an array = 'one.two.three' becomes ['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;
}

答案 1 :(得分:3)

因为JavaScript引用变量中的值而不是将它们“复制”到变量中,所以我们可以创建初始值,然后引用它,我们将在我们深入研究时将其移动:

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指向o最初做同样的事情,当我们将引用(r)深入o并写入它时,我们'我们去的时候重建o

最后两个console.log()调用输出如下:

first log output second log output

另请注意,如果您愿意,我允许您传入一个数组,并将分隔符作为参数,以便您不会遇到.