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 オブジェクトを正しく返します。従業員オブジェクトへの割り当ては失敗します:

Uncaught TypeError: undefined のプロパティ 'undefined' を設定できません

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

これの利点は、どのメソッドが 2 番目の「この値の値」パラメーターをサポートしているかを覚えておく必要がないことです。それは常に機能します。たとえば、これはイベント リスナーを DOM ノードに追加する場合にも機能します。

この特定のケースでは、tjameson の最初の提案がおそらく優先されます。

于 2013-05-16T14:59:17.313 に答える
1

thisコールバック内の値に問題がありforEachます。また、JSON を解析するために jQuery は必要ありません。

代わりにこれを行うことができます:

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 に答える
1

のスコープに問題がありますthis。foreach-callback 内にいる場合、これは正しいインスタンスを参照していません。

beforeへの参照を保存してからthis、その参照 (次の例では 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 に答える
0

JSON を解析する理由はありません。2 つの単純な関数がその仕事を行います (それがアイデアであったことを願っています)。

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 に答える