2013-05-02 47 views
5

Aşağıdaki kod var: http://jsfiddle.net/8tAyu/7/JSON.stringify() replaceer işlevi neden çalışmıyor?

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

böylece güya, bunu geri gelmeli iç içe değil "hafta" en azından düşündüm ve iç içe nasıl yapabileceğimi görecek geri gel. Ama her ne kadar değiştirdiğim önemli değil, console.logundefined'u basar, eğer işlevi her zaman return v olarak değiştirmezsem, tüm nesneyi geri alırım. Neden?

+1

Değiştiriciye yapılan ilk çağrı, "boş bir dizgeye" gönderir ve "undefined" değerini döndürerek dönüştürme işlemini etkili bir şekilde durdurur. –

+0

MDN dokümanlar: başlangıç ​​geçiş göründüğü için ... neden [ikame parametresi] (https://developer.mozilla.org/en-US/docs/Using_native_JSON#The_replacer_parameter) –

+0

ben tür acaba biz "gerek özel olarak ele alınız "... eğer boş anahtar ve nesne tamamlanmadıkça değeri ilk geçerse, ilk geçişe ihtiyacımız varsa her zaman özel işlem yapabiliriz ... ve aslında bir neden göremiyorum ilk geçişi –

cevap

4

Stringify, nesnenin kökü için önce boş bir 'k' ile çağrılıyor gibi görünüyor. Bunun için undefined ve tüm işleme durur.

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

sonra sonucudur: biz bunu değiştirirseniz

{"week":45} 

Sence "taşıma" için undefined dönmek beri, iç içe bir tane ve göz ardı edecek bütün onun içeriği.

+0

ama gerek ne tür http://jsfiddle.net/8tAyu/16/ gibi boş bir dize, adıyla bir özelliği vardır foo' nesne 'o zaman bunu içerecektir eğer çok –

+1

@ 動靜 能量: Ayrıca v && typeof v === "object" 'yapmalısınız. Ve sonra iç içe geçmiş haftayı istiyorsanız, '! K' kısmından kurtulun. –

+0

@squint tam kod verir ... illâ http://jsfiddle.net/8tAyu/27/ demek yapmak ve o işe yaramaz olabilir ... –