我一直都在搜索,我知道有很多关于这方面的话题,但我没有找到一个回答我的问题。
我看到了一个关于从这样的字符串中获取对象值的问题:
function getPropertyByString(str) {
var properties = str.split(".");
var myTempObject = window[properties[0]];
for (var i = 1, length = properties.length; i < length; i++) {
myTempObject = myTempObject[properties[i]];
}
return myTempObject;
}
因此,如果有一个名为myGlobalVar的全局变量,你可以传递字符串'myGlobalVar.someProp.stateName',并且假设这一切都是有效的,你可以获得stateName的值,例如亚利桑那州。
我现在如何将该房产更新到加利福尼亚州?
如果我尝试
var x = getPropertyByString('myGlobalVar.someProp.stateName');
x = 'California';
将更新x的值,而不是对象。
我试过
var x = getPropertyByString('myGlobalVar.someProp.stateName');
x.value = 'California';
也不起作用。
有人可以通过我的例子帮助我理解这一点吗?
由于
答案 0 :(得分:3)
尝试以下方法;
function setPropertyByString(path, value) {
var steps = path.split("."),
obj = window,
i = 0,
cur;
for (; i < steps.length - 1; i++) {
cur = obj[steps[i]];
if (cur !== undefined) {
obj = cur;
} else {
break;
};
};
obj[steps[i]] = value;
}
它可以通过使用它来工作,如;
setPropertyByString('myGlobalVar.someProp.stateName', 'California');
你可以在这里看到它; http://jsfiddle.net/xCK8J/
你的原因不起作用是因为字符串在JavaScript中是不可变的。您正在使用值“加利福尼亚”重新分配变量x
,而不是更新它指向“加利福尼亚”的位置。
如果你已经完成了;
var x = getPropertyByString('myGlobalVar.someProp');
x.stateName = 'California';
You'd see it works;因为你正在操纵x
指向的对象,而不是将x
重新分配为其他东西。以上是setPropertyByString()
方法在幕后的作用;它只是隐藏了你。
答案 1 :(得分:2)
这样可以解决问题:
myGlobalVar.someProp.stateName = "California"
那就是这样:
myGlobalVar["someProp"].stateName = "California"
或者这个:
myGlobalVar["someProp"]["stateName"] = "California"
或者,
var x = getPropertyByString('myGlobalVar.someProp');
x.stateName = "California"
请注意,如果在我的上一个例子中,我做了类似的事情:
x = {stateName:"California"};
它不会更改myGlobalVar.someProp.stateName的值。
使用=
为LHS上的变量分配一个新值。这与为变量的引用分配新值不同。