2012-11-25 4 views
0

replacer 함수 안에 열거되지 않는 속성을 serialize하려고합니다.JSON.stringify replacer 함수 내에서 열거 가능 속성을 변경할 수 없습니까?

무엇이 잘못 되었나요?

도와주세요.

var obj = {x:1,y:2}; 
Object.defineProperty(obj,"x",{enumerable:false}); 


var s = JSON.stringify(obj,function(key,value){ 
if(this.propertyIsEnumerable(key) == false){ 
Object.defineProperty(this,key,{enumerable:true}); 
} 
return value;}); 

//"{"y":2}" 
// x remains not enumerable 

I 비 열거 특성을 추측은 대체물 함수의 실행 전에 여과되고있다. 확실하지 않다.

+0

을'.stringify' 비 열거 필터링하는 경우 그런 다음 예, 그들은 콜백에서 사용할 수 없습니다 - 그것은 이미 그 필터를 완료했습니다. 문자열 화하기 전에 객체의 모든 키를 반복하여 'for (key in obj)'하고, 내부 논리를 사용하여 열거 형으로 설정하십시오. 그런 다음 단순히 JSON.stringify (obj);를 호출하십시오. – Ian

+0

잘 들어, 루프에 대해 열거 할 수없는 속성은 포함되지 않습니다. –

+0

아, 맞아요. 그렇다면 직렬화에 포함시키려는 '열거 형'으로 설정되지 않은 것은 무엇입니까? – Ian

답변

1

.stringify은 열거 할 수없는 속성을 필터링하고 그렇다면 콜백에서 사용할 수 없으며 필터를 이미 완료했습니다. 문자열 화하기 전에 객체의 모든 키를 반복해서 살펴보고, 내부 논리를 사용하여 열거 형으로 설정하십시오. 그런 다음 JSON.stringify(obj);으로 전화하십시오. 불행히도 당신이 지적한대로 for in 루프와 jQuery의 $.each은 열거 불가능한 키를 반복하지 않습니다. 내가 .getOwnPropertyNames 당신이 원하는 것을 달성해야한다고 발견 - 여기

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames이 그것을 사용하는 예입니다, 당신의 코드와 유사 당신이 제공 :

http://jsfiddle.net/9Em82/

var obj = {x:1,y:2}; 

Object.defineProperty(obj,"x",{enumerable:false}); 

var all = Object.getOwnPropertyNames(obj); 
for (var i = 0, j = all.length; i < j; i++) { 
    console.log("KEY: " + all[i]); 
} 
관련 문제