如何在javascript中使用变量属性在对象树的深处声明值
我试图让javascript对象树以如下方式表现为php关联数组如何在javascript中使用变量属性在对象树的深处声明值,javascript,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] = {}; ... 有没有办法简化或缩短此脚本 谢谢 此语法是JSON格式的基础: 此语法是
var key1 = 'a';
var key2 = 'b';
var key3 = 'c';
var obj[key1][key2][key3] = 'd';
然而,在javascript中,我相信您需要单独定义每个属性/对象对,形成更深的叶子。比如:
var obj[key1] = {};
var obj[key1][key2] = {};
...
有没有办法简化或缩短此脚本
谢谢
此语法是JSON格式的基础:
此语法是JSON格式的基础:我不知道是否有“自然”的方法,但您可以这样做:
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]);
函数phpLike(){};
phpLike.prototype.set=函数()
{
var l=arguments.length;
如果(l我不知道是否有一种“自然”的方法,但你可以这样做:
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]);
函数phpLike(){};
phpLike.prototype.set=函数()
{
var l=arguments.length;
就我所知,如果(l不是直接的,但是使用一个小辅助函数怎么样
function kv1(k, v) {
var o = { };
o[k] = v;
return o;
}
var obj = kv1(key1, kv1(key2, kv1(key3, 'd')));
据我所知,不是直接的,但是使用一个小助手函数怎么样
function kv1(k, v) {
var o = { };
o[k] = v;
return o;
}
var obj = kv1(key1, kv1(key2, kv1(key3, 'd')));
我刚刚想到了一个受威尔文章启发的答案:构造一个json字符串,然后eval()
这种方式满足了我对声明对象树和深叶的更简洁的方式的搜索。但是,它丑陋、混乱,我会像躲避瘟疫一样避免它。我刚刚想到了一个受威尔文章启发的答案:构造一个json字符串,然后eval()
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)
这种方法满足了我对更简洁的声明对象树和深叶的搜索。但是,它丑陋、混乱,我会像瘟疫一样避免它。key1将被视为您示例中的属性名称,而不是引用“a”的变量。我错了,我误解了问题,认为“key1”在您的示例中,key1将被视为属性名,而不是引用“a”的变量。我的错误是,我误解了这个问题,认为“key1”是的,但我认为只需要创建一个深度嵌套的对象,然后可以根据需要进行扩展。这不会用新的键删除以前设置的键吗?是的,但我认为只需要创建一个深度嵌套的对象ECT,以后可以根据需要进行扩展。如果你决定这样做,你可以用一个好的Struth.Frand原型来清理它,以得到所有丑陋的连接。也可以考虑使用jSON.PARSE(内置到许多现代浏览器)。如果你真的决定这样做,你可以用一个好的Struth.Frand原型来清理它,以得到所有丑陋的连接。也可以考虑使用JSON.PARSE(内置于许多现代浏览器),而不是为了安全而使用EVE。
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)