2013-05-02 15 views
5

は、私は次のコードを持っている:JSON.stringify()リプリケータ関数が機能しないのはなぜですか?

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

をので、おそらく、私は少なくとも、ネストされていない「週」が戻ってくる必要があると思った、と私は、ネストされたものを作成する方法について説明します戻ってくる。しかし、私がそれをどのように変更しても、はundefinedを出力します。私は単にreturn vに機能を変更しない限り、オブジェクト全体を戻します。何故ですか?

+1

リパイラへの最初の呼び出しは '' '(空文字列)で送信され、' undefined'を返すので、変換プロセスは事実上停止します。 –

+0

MDN docs:[Replacerパラメータ](https://developer.mozilla.org/en-US/docs/Using_native_JSON#The_replacer_parameter) –

+0

私は最初のパスがなぜなのか疑問に思います...私たちは "それを特別に扱います...もし空のキーを持つ最初のパスとオブジェクトとしての値が行われなければ、最初のパスが必要な場合はいつでも特別な処理を行うことができます。実際には理由はありませんその最初のパスを必要とするのは –

答えて

4

Stringifyは、最初に、オブジェクトのルートとして空の '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/を意味し、それは動作しません... –

関連する問題