0

我有一个 JSON 对象员工,我想用本地存储中的数据填充它。我首先使用 .将我的 JSON 对象保存到本地存储stringify()

    sessionStorage.setItem('Employee3', JSON.stringify({id: 3, firstName: 'Dwight', lastName: 'Schrute', title: 'Assistant Regional Manager', managerId: 2, managerName: 'Michael Scott', city: 'Scranton, PA', officePhone: '570-444-4444', cellPhone: '570-333-3333', email: 'dwight@dundermifflin.com', reportCount: 0}));

现在我想填充我的员工对象:

employees: {},

populate: function() {
    var i = i;
    Object.keys(sessionStorage).forEach(function(key){
        if (/^Employee/.test(key)) {
            this.employees[i] = $.parseJSON(sessionStorage.getItem(key));
            i++;
        }
   });  
},

该函数$.parseJSON(sessionStorage.getItem(key))正确返回 JSON 对象。将其分配给员工对象失败:

未捕获的类型错误:无法设置未定义的属性“未定义”

4

5 回答 5

3

Array.forEach不保存this,所以你必须自己保存它。这些中的任何一个都可以工作(请参阅mdn):

Object.keys(sessionStorage).forEach(function(key){
    if (/^Employee/.test(key)) {
        this.employees[i] = $.parseJSON(sessionStorage.getItem(key));
        i++;
    }
}, this);

var self = this;
Object.keys(sessionStorage).forEach(function(key){
    if (/^Employee/.test(key)) {
        self.employees[i] = $.parseJSON(sessionStorage.getItem(key));
        i++;
    }
});

另外,考虑使用浏览器JSON.parse()而不是 jQuery。任何支持的浏览器Array.forEach都会支持JSON.parse().

于 2013-05-16T14:49:46.737 回答
2

还有一种方式:

Object.keys(sessionStorage).forEach((function(key){
    if (/^Employee/.test(key)) {
        this.employees[i] = $.parseJSON(sessionStorage.getItem(key));
        i++;
    }
}).bind(this));

调用.bind(this)一个函数将返回一个绑定到this(在当前范围内)值的新函数。

这样做的好处是您不需要记住哪些方法支持第二个“此值”参数。它总是有效的。例如,这也适用于将事件侦听器添加到 DOM 节点时。

在这种特定情况下,tjameson 的第一个建议可能是首选。

于 2013-05-16T14:59:17.313 回答
1

你的范围有问题this。当您在 foreach-callback 中时,这不是指正确的实例。

您需要保存对thisbefore 的引用,然后通过该引用访问对象(以下示例中的 self ):

function something(){    
    var self = this;
    ** snip **
    employees: {},

    populate: function() {
        var i = i;
        Object.keys(sessionStorage).forEach(function(key){
            if (/^Employee/.test(key)) {
                self.employees[i] = $.parseJSON(sessionStorage.getItem(key));
                i++;
            }
       });  
    },
    ** snip ** 
}
于 2013-05-16T14:49:21.847 回答
1

回调this内部的值有问题。forEach此外,您不需要 jQuery 来解析 JSON。

你可以这样做:

employees: {},

populate: function() {
    var that = this;
    var i = i;
    Object.keys(sessionStorage).forEach(function(key){
        if (/^Employee/.test(key)) {
            that.employees[i] = JSON.parse(sessionStorage.getItem(key));
            i++;
        }
   });  
},
于 2013-05-16T14:47:22.887 回答
0

没有理由解析 JSON,两个简单的函数就可以完成这项工作(希望是这个想法):

var employees = {};

function setEmployee( data ) {
    var id = data.id;
    sessionStorage.setItem('Employee' + id, JSON.stringify( data ));
};

function getEmployee( id ) {
    employees[id] = sessionStorage.getItem('Employee' + id);
};

var oneEmployee = {
    id: 3,
    firstName: 'Dwight',
    lastName: 'Schrute',
    title: 'Assistant Regional Manager',
    managerId: 2,
    managerName: 'Michael Scott',
    city: 'Scranton, PA',
    officePhone: '570-444-4444',
    cellPhone: '570-333-3333',
    email: 'dwight@dundermifflin.com',
    reportCount: 0
};

setEmployee( oneEmployee );

getEmployee( 3 );
于 2013-05-16T15:07:40.987 回答