如何在javascript中使用变量属性在对象树中声明深度值

时间:2010-03-23 02:49:44

标签: javascript

我试图通过以下方式使javascript对象树的行为类似于php关联数组。

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

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

然而,在javascript中我认为你需要单独定义每个属性/对象,形成更深的叶子。类似的东西:

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

有没有办法简化或缩短此脚本?

由于

5 个答案:

答案 0 :(得分:1)

我不知道是否有一种“自然”的方式,但你可以这样做:

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]);

答案 1 :(得分:1)

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)

答案 2 :(得分:0)

据我所知,不是直接使用辅助函数吗?

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

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

答案 3 :(得分:0)

我只想到了Will的帖子启发的答案:构造一个json字符串,然后是eval()。

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

这种实现了我寻找一种更简洁的方式来声明对象树和深叶。但是,它是丑陋的,令人困惑的,我会像瘟疫一样避免它。

答案 4 :(得分:-1)

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

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