2013-05-02 2 views
5

나는 다음과 같은 코드가 있습니다 http://jsfiddle.net/8tAyu/7/JSON.stringify() 대체 함수가 작동하지 않는 이유는 무엇입니까?

var foo = { 
    "foundation": "Mozilla", 
    "model": "box", 
    "week": 45, 
    "transport": { 
     "week": 3 
    }, 
    "month": 7 
}; 

console.log(JSON.stringify(foo, 
          function(k, v) { 
           if (k === "week") 
            return v; 
           else 
            return undefined; 
          })); 

그래서 아마도, 내가 그가 다시 와야 중첩되지 않는 "주"적어도 생각, 내가 중첩 된 하나를 만드는 방법을 볼 것이다 다시와. 그러나 내가 어떻게 그것을 변경하더라도, console.logundefined을 출력합니다. 만약 내가 단순히 return v으로 기능을 변경하지 않는다면, 나는 전체 객체를 돌려줍니다. 왜 그런가요?

+1

replacer에 대한 첫 번째 호출은'' "(빈 문자열)을 보내고'undefined'를 반환하므로 효과적으로 변환 프로세스가 중단됩니다. –

+0

MDN docs : [Replacer 매개 변수] (https://developer.mozilla.org/en-US/docs/Using_native_JSON#The_replacer_parameter) –

+0

왜 초기 패스가 필요한지 궁금합니다 ... 우리는 " 특별히 처리하십시오. "... 첫 번째 패스가 빈 키와 객체 값으로 처리되지 않으면 첫 번째 패스가 필요할 경우 항상 특별한 처리를 할 수 있습니다. 실제로는 이유가 표시되지 않습니다. 첫 번째 패스가 필요합니다. –

답변

4

문자열 화는 먼저 개체의 루트에 빈 'k'가있는 것으로 간주됩니다. 우리는 정의되지 않은 상태로 돌아오고 모든 처리가 중지됩니다.

if (!k || (k == "week")) 

그 결과는 다음과 같습니다 : 우리가 그것을 변경하는 경우

{"week":45} 

당신은 우리가 "전송"에 대한 undefined을 반환하기 때문에, 중첩 된 하나를 얻을 무시하지 않습니다 모든 내용.

+0

하지만'foo' 객체가 http://jsfiddle.net/8tAyu/16/과 같이 빈 문자열의 이름을 가진 속성을 가진다면 그 객체도 포함됩니다 –

+1

@ 動靜 能量 : 또한 v && typeof v === "object"'를 수행해야합니다. 그리고 중첩 된 주를 원하면'! k' 부분을 제거하십시오. –

+0

@squint 전체 코드를 제공 할 수 있습니까? 그렇지 않으면 http://jsfiddle.net/8tAyu/27/을 의미하며 작동하지 않습니다 ... –

관련 문제