Arrays 使用JSON.parse时,对象数组的第一个元素作为未定义元素传递

Arrays 使用JSON.parse时,对象数组的第一个元素作为未定义元素传递,arrays,object,undefined,Arrays,Object,Undefined,我正在使用HTML5的本地存储来保存一个用户偏好的小数据库。为此,我有以下功能: function save(UserDB) { if (window.localStorage) { // Only do this if the browser supports it localStorage.setObject('UserDataBase', JSON.stringify(UserDB)); } 与 UserDB是一个类似以下内容的对象数组: [{“uid”

我正在使用HTML5的本地存储来保存一个用户偏好的小数据库。为此,我有以下功能:

function save(UserDB) {
    if (window.localStorage) {  // Only do this if the browser supports it
        localStorage.setObject('UserDataBase', JSON.stringify(UserDB));
    }

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;
};
函数应用程序配置(数据){
if(window.localStorage){
var UserDBx=localStorage.getObject('UserDataBase');
console.log(“找到用户配置”);
log(UserDBx);
console.log(“ActualGetObject”);
log(localStorage.getObject('UserDataBase');
log(UserDBx.length);
对于(变量i=0;i

结果是console.log(localStorage.getObject('UserDataBase');正确返回对象数组,但不返回console.log(UserDBx);返回第一个元素为“未定义”的对象数组。知道为什么会发生这种情况吗?

我面临着同样的问题,在start中看到未定义的元素。以下是我的代码:

var x;
for (i = 0; i < content.length; i++) {
    x += content[i].name;
console.log(x);
} 
varx;
对于(i=0;i
原因是未定义的x。我声明了它,但没有给它赋值。所以我只是将var x改为var x=”“,解决了这个问题

无错误代码

var x="";
for (i = 0; i < content.length; i++) {
    x += content[i].name;
console.log(x);
} 
var x=”“;
对于(i=0;i
我注意到我使用了两次JSON.stringify。我修好了,但结果是一样的。我认为需要指出的是,问题似乎出现在以下赋值中:var UserDBx=localStorage.getObject('UserDataBase');由于右侧返回了正确的值,但左侧没有,所以我没有看到错误。关于Chrome/Safari上的控制台日志错误,SO中有很多问题。您可能需要检查它们。@Jay,是的,如果我显式调用UserDBx[0],我就可以访问它的内容,这可能是一个bug。到目前为止,Chrome的控制台似乎还不能代表第一个元素。我在运行时遇到了一个类型错误,但结果是另一个原因。然而,使用console.log(UserDB)仍然会将第一个元素显示为未定义,但代码的其余部分可以使用它。
var x="";
for (i = 0; i < content.length; i++) {
    x += content[i].name;
console.log(x);
}