Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中使用变量属性在对象树的深处声明值_Javascript - Fatal编程技术网

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

如何在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格式的基础: 此语法是

我试图让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格式的基础:

此语法是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)