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