【发布时间】:2012-11-03 02:26:26
【问题描述】:
我正在使用 HTML5 的本地存储来保存用户偏好的小型数据库。为此,我有以下功能:
function save(UserDB) {
if (window.localStorage) { // Only do this if the browser supports it
localStorage.setObject('UserDataBase', JSON.stringify(UserDB));
}
与
Storage.prototype.setObject = function(key, value) {
this.setItem(key, JSON.stringify(value));
}
UserDB 是一个类似这样的对象数组:
[{"uid":"ABC","groupname":"我的群组","calendarid":"sdf44d7g3ak5q8ifdrl308hk0@group.calendar.google.com","link":null,"userenable":true, "color":"528800"},{"uid":"CdO","groupname":"CKHO","calendarid":"apkrty45sdfer44fd1mr55dfghfg8@group.calendar.google.com","link":null,"userenable ":true,"color":"AB8B00"}]
这似乎工作得很好。
然后,当用户再次加载站点时,我希望能够根据上一个会话中存储的信息在变量中重新生成对象数组:
Storage.prototype.getObject = function(key) {
var value = JSON.parse(this.getItem(key));
return JSON.parse(value);
}
这似乎也有效。问题是当我使用最后一个函数来实际存储数组时:
function ApplyUserConfiguration(Data) {
if (window.localStorage) {
var UserDBx = localStorage.getObject('UserDataBase');
console.log("User Configuraiton found");
console.log(UserDBx);
console.log("ActualGetObject");
console.log(localStorage.getObject('UserDataBase'));
console.log(UserDBx.length);
for (var i = 0; i < Data.length; i++){
for (var j=0; j< 5; j++){
if(Data[i].uid == UserDBx[j].uid){
Data[i].userenable = UserDBx[j].userenable;
Data[i].Color = UserDBx[j].color;
delete UserDBx[j];
break;
}
}
}
}
return Data;
};
原来console.log(localStorage.getObject('UserDataBase'));正确返回对象数组,但 console.log(UserDBx);返回第一个元素为“未定义”的对象数组。知道为什么会这样吗?
【问题讨论】:
-
我注意到我使用了 JSON.stringify 两次。我修复了它,但结果是一样的。我认为重要的是要指出问题似乎出在以下分配中: var UserDBx = localStorage.getObject('UserDataBase');由于右侧返回正确的值,但左侧没有,我只是没有看到错误。
-
SO 中有很多关于 Chrome/Safari 上的控制台日志记录错误的问题。你可能想检查一下。
-
@Jay,是的,这可能是一个错误如果我明确调用 UserDBx[0],我可以访问它的内容。到目前为止,Chrome 的控制台似乎不能代表第一个元素。我在运行时遇到类型错误,但结果是另一个原因。然而,使用 console.log(UserDB) 仍然会将第一个元素显示为未定义,但其余代码可以使用它。