2012-06-16 4 views
6

브라우저에서 표시하고 조작 할 수있는 데이터가 포함 된 일부 개체로 작업하고 있는데이를 로컬 저장소에 저장하려고합니다. 내가 JSON.stringify() 그래서 모든 될 텍스트를 사용하는 오브젝트를 저장하기 위해 , 그리고 내가 문자열로 변환하여도 기능을 저장하려고하고 그것을localstorage에 함수 저장

을 saveing있어 지금은 잘

{ 
"bindingRef": [], 
"primo": { 
    "name": "primo", 
    "modifiable": true, 
    "binded": false, 
    "isInteger": false, 
    "label": "Numero di Primi" 
}, 
"secondo": { 
    "name": "secondo", 
    "modifiable": true, 
    "binded": false, 
    "isInteger": false, 
    "label": "Numero di Secondi" 
} 
} 

를 작동

JSON.stringify(myFunction.toString()); 

하지만 출력은이

"savedFunction": "function() {\n\t\t\t\tvar tot = menu.primo.get() * 6 + menu.secondo.get() * 8 + menu.dolce.get() * 4;\n\t\t\t\tif (menu.sconto.get()) {\n\t\t\t\t\treturn tot * 0.90;\n\t\t\t\t} else {\n\t\t\t\t\treturn tot;\n\t\t\t\t}\n\t\t\t}" 

는 로컬 스토리지에 저장 기능을하는 올바른 방법인가, 아니면이 할 수있는 더 나은 방법이있다? 이것이 올바른 방법이라면 단순히 임의의 표/들여 쓰기 문자를 제거하는 방법이 있습니까? 예를 들어 regexp 함수를 사용하여 문자열을 조작해야합니까?

+0

개체의 문자열 또는 함수 서명을 저장 하시겠습니까? 어떤 결과를 기대합니까? – Sarfraz

+0

왜 함수를 저장 하시겠습니까? 필자가 생각하기에 실제로는 전혀 이해가되지 않기 때문에 "올바른"방법이 없다. 함수의'.toString()'버전을 저장하고 싶다고 가정한다면, 왜 (.replace()로 할 수있는) 탭을 제거하고 싶습니까? – nnnnnn

답변

5

많은 기능적 언어에서와 같이 JS의 기능은 폐쇄 형입니다. db 또는 파일 핸들과 같은 일시적인 데이터를 포함하여 정의의 순간에 환경 범위의 내용으로 둘러싸여 있습니다.

JSON 역 직렬화 동작으로 인해 문제가 발생할 수 있기 때문에 좋지 않습니다. 따라서 랩핑 된 함수와 자체 정의한 함수를 확인해야합니다.

자세한 내용은 SO thread도 참조하십시오.

+0

유용한 링크와 유용한 답변, 함수 저장을 피하려고 노력할 것입니다. 덕분에 – Naigel

1

함수를 객체에 넣고 localStorage.set 및 localStorage.get 대신 작성한 storage.get 및 storage.get을 사용할 수 있습니다. (localStorage는 JSON과 달리 함수를 추가 할 수 없습니다).

storage.set는 localStorage.setItem()을 사용하기 전에 함수를 포함하는 객체를 문자열로 나타냅니다.
storage.get은 localStorage.getItem()을 사용한 후 함수를 포함하는 객체를 구문 분석합니다.

함수를 처리 할 수 ​​있도록 JSON.stringify 및 JSON.parse 함수를 수정하여 함수 이름을 변경하지 않고 코드의 다른 부분에서 사용할 수 있습니다. 원래 기능에 2를 추가 했으므로 업데이트 된 기능 내에서 사용할 수 있습니다.

JSON.stringify2 = JSON.stringify; 
JSON.parse2 = JSON.parse; 

JSON.stringify = function(value) { 
    return JSON.stringify2(value, function(key, val) { 
     return (typeof val === 'function') ? val.toString().replace(/\t|\n/g, '') : val; 
    }); 
} 

JSON.parse = function(value) { 
    return JSON.parse2(value, function(key, val) { 
     if (typeof val === 'string') { 
      var regex = /^function\s*\([^()]*\)\s*{.*}$/; 

      if (regex.exec(val) !== null) 
       return eval('key = ' + val); 
      else 
       return val; 
     } else 
      return val; 
    }); 
} 

var storage = {}; 

storage.set = function(key, value) { 
    if (typeof value === 'object') 
     value = JSON.stringify(value); 

    localStorage.setItem(key, value); 
} 

storage.get = function(key) { 
    var value = localStorage.getItem(key); 

    try { 
     return JSON.parse(value); 
    } catch (e) { 
     return value; 
    } 
} 
+0

원주민을 무시하는 것은 나쁜 습관입니다. 새로운 기능을 만드는 것을 고려하십시오. – neeh