2013-05-16 2 views
0

내 로컬 저장소의 데이터로 채우려는 JSON 개체 직원이 있습니다. 우선 stringify()을 사용하여 JSON 객체를 로컬 저장소에 저장했습니다.JSON 개체에 JSON 개체 추가

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: '[email protected]', 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++; 
     } 
    }); 
}, 

제대로 JSON 개체를 반환 $.parseJSON(sessionStorage.getItem(key)) 기능. 직원이 객체에 할당하는 것은 실패

catch되지 않은 형식 오류 : 정의되지 않은

+0

'employees'는 배열로 취급되는 반면 개체입니다. 'employees'를 배열로 선언하는 것은 어떨까요? – shahkalpesh

+0

원래 스 니펫에서는 localstorage를 사용하지 않았으므로 지금 추가하고 있습니다. 그들은 그것을 배열로 취급하고 작동했습니다 : this.employees [4] = {id : 4, firstName : 'Jim', lastName : 'Halpert', title : 'Assistant Regional Manager', managerId : 2, managerName : 'Michael Scott ', 도시 :'Scranton, PA ', office 전화 :'570-222-2121 ', cellPhone :'570-999-1212 ', 이메일 :'[email protected] ', reportCount : 1}; – Hazaart

+0

@shahkalpesh : 그건 잘못되었습니다.JavaScript에서는 대괄호를 사용하여 객체의 속성에 액세스 할 수 있습니다. 그것은 배열의 인덱스에 대한 액세스를 반드시 의미하지는 않습니다. – Kenneth

답변

3

Array.forEachthis을 보존하지 않습니다

당신은 (다음 예에서 자기) 전에 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()을 지원합니다.

+0

또는 iterator 함수에서'.bind (this)'를 사용하십시오. –

+0

jQuery를 사용한다면'JSON.parse'를 사용할 이유가 없습니다 - jQuery가 시도한 다음 다른 메소드로 다시 돌아갑니다. 나는 확신하지 못하는 것보다는 그것을 사용하고 싶습니다. – Ian

+0

@MerynStol - OP 만이 배열에 대해 하나의 컨텍스트를 사용하고자 할 때만 작동합니다. 왜냐하면'this'를 재정의 할 수 없기 때문입니다. [mdn] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind)을 참조하십시오. – tjameson

1

의 '정의되지 않은'설정할 수 없습니다 속성은 당신은 forEach 콜백 내부 this의 값에 문제가 있습니다. 또한 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++; 
     } 
    }); 
}, 
+0

'JSON을 파싱 할 때 jQuery가 필요 없다. '- 그렇다면 왜 당신의 대답은 여전히'$ .parseJSON'인가? :) – Ian

+1

@Ian 그것을 지적 해 주셔서 고맙습니다. 나는 서둘러 내 대답을 편집하고 잘못된 부분을 잘라 냈습니다. – bfavaretto

1

당신은 this의 범위에 문제가 있습니다. foreach-callback 안에있을 때 이것은 올바른 인스턴스를 가리키고 있지 않습니다. 당신은 유지해야하므로,

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 ** 
} 
2

또 다른 방법 : (현재 범위에서) this에 대한 값에 바인딩 된 새로운 기능을 반환하는 기능에 대한 .bind(this)를 호출

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

.

이점은 두 번째 "this for this"매개 변수를 지원하는 메소드를 기억할 필요가 없다는 것입니다. 그것은 항상 작동합니다. 예를 들어, DOM 노드에 이벤트 리스너를 추가 할 때도 마찬가지입니다.

이 특별한 경우에는 tjameson의 첫 번째 제안이 선호됩니다.

+0

기술적으로 유효합니다. 유일한 해결 방법은 +1입니다. – tjameson

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: '[email protected]', 
    reportCount: 0 
}; 

setEmployee(oneEmployee); 

getEmployee(3);