2013-05-02 21 views
5

Mam następujący kod:Dlaczego funkcja zastępcza JSON.stringify() nie działa?

http://jsfiddle.net/8tAyu/7/

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; 
          })); 

tak podobno, myślałem, co najmniej „tydzień”, że nie jest zagnieżdżona powinien wrócić, a ja zobaczę, jak zrobić jeden zagnieżdżony wróć też. Ale niezależnie od tego, jak to zmienię, console.log wypisze undefined, chyba że zawsze zmieniam funkcję po prostu na return v, a następnie otrzymam z powrotem cały obiekt. Dlaczego?

+1

Ponieważ pierwsze wywołanie zastępcy wysyła w '' "' (pusty ciąg), i zwracasz 'niezdefiniowane', skutecznie zatrzymując proces konwersji. –

+0

Dokumenty MDN: [Parametr zastępczy] (https://developer.mozilla.org/en-US/docs/Using_native_JSON#The_replacer_parameter) –

+0

Zastanawiam się, dlaczego pierwsza przepustka jest dla ... wydaje się, że musimy " specjalnie sobie z tym poradzisz "... jeśli to pierwsze przejście z pustym kluczem i wartością, gdy obiekt nie zostanie wykonany, zawsze możemy zrobić specjalne przetwarzanie, jeśli potrzebujemy tego pierwszego przejścia ... i tak naprawdę nie widzę powodu wymagające tego pierwszego podania –

Odpowiedz

4

Łańcuch wydaje się być wywołany, najpierw z pustym "k" dla katalogu głównego obiektu. W tym celu zwracamy wartość undefined, a wszystkie zatrzymania przetwarzania.

Jeśli zmienimy go na adres:

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

wtedy wynik jest:

{"week":45} 

Nie dostaniesz zagnieżdżony jeden, ponieważ wracamy undefined dla „transport” i ignorować wszystkie jego zawartość.

+0

, ale co jeśli obiekt 'foo' ma właściwość z nazwą pustego ciągu znaków, np. w http://jsfiddle.net/8tAyu/16/, wówczas będzie go również zawierał –

+1

@ 動靜 能量: Powinieneś także wykonać 'v && typeof v ===" obiekt "'. A jeśli chcesz zagnieżdżonego tygodnia, pozbądź się części '! K'. –

+0

@ Czy możesz podać pełny kod ... czy też masz na myśli http://jsfiddle.net/8tAyu/27/ i to nie zadziała ... –

Powiązane problemy