【问题标题】:The first element of an Object Array is passed as undefined when using JSON.parse使用 JSON.parse 时,对象数组的第一个元素作为未定义传递
【发布时间】: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) 仍然会将第一个元素显示为未定义,但其余代码可以使用它。

标签: arrays object undefined


【解决方案1】:

我遇到了同样的问题,即在开始时看到未定义的元素。以下是我的代码:

var x;
for (i = 0; i < content.length; i++) {
    x += content[i].name;
console.log(x);
} 

原因是未定义的 x。我在声明它,但我没有给它任何价值。所以我只是将 var x 更改为 var x="" 并解决了问题。

无错误代码

var x="";
for (i = 0; i < content.length; i++) {
    x += content[i].name;
console.log(x);
} 

【讨论】:

    猜你喜欢
    • 2015-05-25
    • 2018-05-20
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多