Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.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对象(JSON)动态添加子项_Javascript_Json - Fatal编程技术网

如何向JavaScript对象(JSON)动态添加子项

如何向JavaScript对象(JSON)动态添加子项,javascript,json,Javascript,Json,我正在尝试创建一个JavaScript对象并动态定义其子对象。因此,子项是动态的,它们可能在运行时发生变化 我有什么var_obj={} 在下一步中,我想在运行时使用函数设置一些变量。我找不到有效的解决方法来实现以下功能: setObjValue(“spaceA.spaceB.id”,1): \u obj.spaceA.spaceB.id=1 我尝试根据分割密钥,然后使用循环逐步创建路径。然而,由于我们在JavaScript中没有引用,所以不可能实现这一点 换句话说,如何使函数以以下模式添加对象

我正在尝试创建一个JavaScript对象并动态定义其子对象。因此,子项是动态的,它们可能在运行时发生变化

我有什么<代码>var_obj={}

在下一步中,我想在运行时使用函数设置一些变量。我找不到有效的解决方法来实现以下功能:

setObjValue(“spaceA.spaceB.id”,1)1
保存在以下路径中的code>:

\u obj.spaceA.spaceB.id=1

我尝试根据
分割密钥,然后使用循环逐步创建路径。然而,由于我们在JavaScript中没有引用,所以不可能实现这一点

换句话说,如何使函数以以下模式添加对象

_obj[“spaceA”][“spaceB”]…[“id”]=1

  • 运行前未定义根步骤数。所以我不能手动使用代码。我需要像上面的示例函数那样动态地实现这一点
试试这个:

function setObjValue(object, path, value) {
    var pathArray = path.split('.');
    for(var i = 0; i < pathArray.length; i++) {
        var name = pathArray[i];
        if(i == pathArray.length-1) {
            object[name] = value;
        } else {
            if(!(name in object)) object[name] = {};
            object = object[name];
        }
    }
    return;
}

var obj = {};
setObjValue(obj, "test1.test2.sub", "123");
console.log(obj);
函数setObjValue(对象、路径、值){
var pathArray=path.split('.');
对于(变量i=0;i
试试这个:

function setObjValue(object, path, value) {
    var pathArray = path.split('.');
    for(var i = 0; i < pathArray.length; i++) {
        var name = pathArray[i];
        if(i == pathArray.length-1) {
            object[name] = value;
        } else {
            if(!(name in object)) object[name] = {};
            object = object[name];
        }
    }
    return;
}

var obj = {};
setObjValue(obj, "test1.test2.sub", "123");
console.log(obj);
函数setObjValue(对象、路径、值){
var pathArray=path.split('.');
对于(变量i=0;i
这一个应该以最有效的方式完成

function setObjValue(path, value) {
    path = path.split('.')
    var obj = path[0]
    //  make obj the root
    path.shift()
    //  remove root object from path
    while(path.length){
        //  move further in tree
        obj = obj[path[0]]
        obj.shift()
    }
    //  assign value
    obj = value
}

这个应该以最有效的方式来做

function setObjValue(path, value) {
    path = path.split('.')
    var obj = path[0]
    //  make obj the root
    path.shift()
    //  remove root object from path
    while(path.length){
        //  move further in tree
        obj = obj[path[0]]
        obj.shift()
    }
    //  assign value
    obj = value
}
递归

var startingObj = {};
var path = "one.two.three.four".split('.');
var val = 7;

function recursiveFun(o, p, v){
  var key = p.shift(); // get the current key

  if (p.length == 0){
    // set key to val and exit
    o[key] = val;
    return;
  }

  o[key] = {}; // should check if this exists before overwriting
  recursiveFun(o[key], p, v);
}

recursiveFun(startingObj, path, val);
递归

var startingObj = {};
var path = "one.two.three.four".split('.');
var val = 7;

function recursiveFun(o, p, v){
  var key = p.shift(); // get the current key

  if (p.length == 0){
    // set key to val and exit
    o[key] = val;
    return;
  }

  o[key] = {}; // should check if this exists before overwriting
  recursiveFun(o[key], p, v);
}

recursiveFun(startingObj, path, val);

这与您想要的正好相反,但可能会给您一些关于如何实现它的灵感@ClaytonSmith不幸的是,循环阅读是可能的,但是写作是不可能的,因为我们无法从参考中获益。因此,在保存过程中(与您提到的主题相反),任何更改都将应用于局部变量,并且没有对主对象的引用。这与您想要的相反,但可能会给您一些关于如何实现它的启示@ClaytonSmith不幸的是,在循环中读取是可能的,然而,写作是不可能的,因为我们不能从参考中获益。因此,在保存过程中(与您提到的主题相反),任何更改都将应用于局部变量,并且没有对主对象的引用。可能希望将
var
s移动到函数顶部,以便不会错误地猜测范围。可能希望将
var
s移动到函数顶部,以便不会错误地猜测范围。我不确定此函数是否工作,它会引发错误(我没有准确地审阅代码)
setObjValue(“spaceA.spaceB.id”,1)
。这将不起作用。首先,您正在创建一个局部变量
obj
,分配给它,然后再也不返回它,因此您不能期望此函数对其封闭范围有任何影响。此外,您不能通过分配给它的引用(如
obj=value
)来通过引用修改对象。我不确定此函数是否如果成功,它会抛出一个错误(我没有准确地查看代码)
setObjValue(“spaceA.spaceB.id”,1)
。这将不起作用。首先,您正在创建一个局部变量
obj
,分配给它,然后再也不返回它,因此您不能期望此函数对其封闭范围有任何影响。此外,您不能通过分配给它的引用(如
obj=value
)来通过引用修改对象。这是一个很好的解决方案,尾部是cES6中的所有优化都几乎与基于循环的解决方案一样有效。我建议使用
p.shift()
而不是
p.splice(0,1)
。此外,在将
{}
分配给它之前,您应该检查是否定义了
o[key]
(这样您就不会覆盖现有的键)。使用.shift(),我将编辑以添加它。正在检查o[key]在覆盖某些内容之前,这无疑是一个很好的实践,但它可以以不同的方式处理,所以我把它留给OP。不过,我将添加一条注释指出这一点。好的解决方案,以及ES6中的尾部调用优化,将几乎与基于循环的解决方案一样有效。我建议使用
p.shift()
而不是
p.splice(0,1)
。另外,在将
{}
分配给它之前,您应该检查
o[key]
是否已定义(这样您就不会覆盖现有的键)。使用.shift()调用很好,我将进行编辑以添加该键。检查o[key]在覆盖某些内容之前,这绝对是一个很好的做法,但是可以用不同的方式处理,所以我把它留给OP。不过,我会添加一条注释指出这一点。