简体   繁体   中英

how can I declare a value deep in an object tree using variable properties in javascript

I am trying to have a javascript object tree behave like a php associative array in the following way.

var key1 = 'a';
var key2 = 'b';
var key3 = 'c';

var obj[key1][key2][key3] = 'd';

However, in javascript I believe you need to define each property/object pair individually, forming deeper leaves. Something like:

var obj[key1] = {};
var obj[key1][key2] = {};
...

Is there a way to simplify or shorten this script?

Thanks

I don't know if there's a "natural" way to do it, but you could do it like this:

function phpLike(){};
phpLike.prototype.set = function ()
{
    var l = arguments.length;
    if (l<2) return;
    var o = this;
    for (var i=0; i<l-2; i++)
    {
        if (o[arguments[i]] === undefined) o[arguments[i]] = {};
        o = o[arguments[i]];
    }
    o[arguments[l-2]] = arguments[l-1];
}

// Test
var key1 = 'a';
var key2 = 'b';
var key3 = 'c';
var obj = new phpLike();
obj.set(key1, key2, key3, 'd');
alert(obj[key1][key2][key3]);
function setPropertyByKeyPath(obj, path, val) {
    var key;
    while (path.length > 1) {
        key = path.shift();
        obj[key] = typeof obj[key] === "object" ? obj[key] : {};
        obj = obj[key];
    }
    obj[path.shift()] = val;
}

var o = {};
setPropertyByKeyPath(o, ['foo', 'bar'], 5);
alert(o.foo.bar)

Not directly, as far as I know, but how about using a little helper function?

function kv1(k, v) {
    var o = { };
    o[k] = v;
    return o;
}

var obj = kv1(key1, kv1(key2, kv1(key3, 'd')));

I just thought of an answer inspired by Will's post: Construct a json string and then eval().

var obj = eval("{" + key1 + ": {...  }};");

This kind of fulfils my search for a more concise way of declaring an object tree and deep leaf. But, it is ugly, confusing and I would avoid it like the plague.

var obj = { key1: { key2: { key3: 'd' } } }

此语法是称为JSON的格式的基础: http : //en.wikipedia.org/wiki/JSON

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM