Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.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/video/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 如何更新嵌套对象中的变量_Javascript - Fatal编程技术网

Javascript 如何更新嵌套对象中的变量

Javascript 如何更新嵌套对象中的变量,javascript,Javascript,假设我有一个对象,我想在这个对象中设置一个嵌套很深的变量,但是var还不存在。最好的方法是什么?例如,如果我有一个字符串,显示要更新的变量应该在哪里,如下所示 var myObject = {}; var location = "myObject.test.myVar"; var value = "My value!"; setValue(location, value, myObject); 我希望这会导致: myObject = { test: { myVar: "

假设我有一个对象,我想在这个对象中设置一个嵌套很深的变量,但是var还不存在。最好的方法是什么?例如,如果我有一个字符串,显示要更新的变量应该在哪里,如下所示

var myObject = {};
var location = "myObject.test.myVar";
var value = "My value!";
setValue(location, value, myObject);
我希望这会导致:

myObject = {
    test: {
        myVar: "My value!"
    }
};
而且位置可能比这更深。 感谢您的帮助! 谢谢
Andreas

您可以通过点(.)

因此,在您的例子中,您正在用引号指定表达式。你可以试试这个

var location = myObject.test.myVar; //Without quotes
同样,如果有更多嵌套对象

var myObject = {};
var location = "test.my.deep.hidden.nested.myVar";
var otherLoc = "test.my.deep.secret.var";
var value = "My value!";

function setValue(location, value, obj){
  var i, prev = obj, curr;
  location = location.split(".");
  for(i = 0; i < location.length - 1; ++i){
    curr = prev[location[i]];
    if("object" !== typeof curr){
      prev[location[i]] = {}
      curr = prev[location[i]];
    }
    prev = curr;
  }
  curr[location[i]] = value;
}

setValue(location, value, myObject);
setValue(otherLoc, 42, myObject);

console.log(JSON.stringify(myObject));

请注意,您可能需要添加一些功能,例如检查位置是否实际有效(
“this.is..invalid”
)。

此函数将执行您想要的操作。
请注意,它通过引用更改对象。
注意,它忽略了第一个名称,因为它是对象本身

function setValue(location, value, object)
{
    var path = location.split(".");
    var current = object;
    for (var i = 1; i < path.length; i++)
    {
        if ((i + 1) == path.length)
            current[path[i]] = value;
        else
        {
            current[path[i]] = {};
            current = current[path[i]];
        }
    }
}
函数设置值(位置、值、对象)
{
变量路径=位置。拆分(“.”);
无功电流=对象;
对于(变量i=1;i
您确定位置吗?您正在位置和设置值中使用
myObject
。如果
myObject.test
不存在,请看一看。如果我希望它支持字符串,您也可以使用[and]语法?有什么建议吗?像这样的“myObject.test[value]”或“myObject.test['field1']”。为了支持[value],也许我们可以将另一个参数发送到一个数组中包含所有参数的函数?像setValue(“myObject.test[value]”、“myValue”、myObject、{“value”:“另一个值”})@tidelipop
“myObject.test['value']”
“myObject.test.”+value
相同,除非你有一些不好的东西,比如空格。。。
function setValue(location, value, object)
{
    var path = location.split(".");
    var current = object;
    for (var i = 1; i < path.length; i++)
    {
        if ((i + 1) == path.length)
            current[path[i]] = value;
        else
        {
            current[path[i]] = {};
            current = current[path[i]];
        }
    }
}