我试图通过以下方式使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] = {};
...
有没有办法简化或缩短此脚本?
由于
答案 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