2017-07-26 7 views
0

私は現在、 "あなたはjsを知っていません"というシリーズに従ってJavaScriptを学習しています。機能代替場合、キー引数kを用 を未定義である:「JSON.stringify」機能を議論する際には、「タイプ&文法」でJSON.stringifyに関数を渡します。

は、著者は注意

var a = { 
    b: 42, 
    c: "42", 
    d: [11,22,33] 
}; 

JSON.stringify(a, ["b","c"]); // "{"b":42,"c":"42"}" 

JSON.stringify(a, function(k,v){ 
    if (k !== "c") return v; 
}); 
// "{"b":42,"d":[11,22,33]}" 

言及しました最初の呼び出し(オブジェクト自体が渡されている場所)。 ifステートメントは、 "c"という名前のプロパティを除外します。ストリング化は 再帰的であるので、[1,2,3]配列はそれぞれの値(1,2,3) をvとして置換子に渡し、添え字(0,1,2)をkとして渡します。

だから、私は結果が"{"b":42,"c":"42","d":[11,33]}"であることを期待していたJSON.stringify結果

var a = { 
 
    b: 42, 
 
    c: "42", 
 
    d: [11, 22, 33] 
 
}; 
 

 
var result = JSON.stringify(a, function(k, v) { 
 
    //since each index 0, 1, 2 of property "c" will be passed into function as "k", 
 
    //therefore if "k !== 1" should filter out value 22 
 
    if (k !== 1) { 
 
    return v; 
 
    } 
 
}); 
 

 
console.log(result);

から値22を除去することを目的とし、次のコードで出てきています。

はしかし、結果は、代わりに"{"b":42,"c":"42","d":[11,22,33]}"(あなたが見ることができるように、財産cのインデックス1の値22が除外されていない)

私は著者が言ったことを理解逃したのでしたか?何か不足していますか?

+0

@Kaddath - いいえ。Replacer関数は再帰的に実行されます。 – Quentin

+0

@Quentin thx、私は集中していなかった、それは質問に書かれている!あなたは毎日を学びます.. – Kaddath

答えて

3

プロパティ名は常に文字列です。 1 !== "1"。数値ではなく文字列と比較します。

var a = { 
 
    b: 42, 
 
    c: "42", 
 
    d: [11, 22, 33] 
 
}; 
 

 
var result = JSON.stringify(a, function(k, v) { 
 
    if (k !== "1") {  // "1" not 1 here 
 
    return v; 
 
    } 
 
}); 
 

 
console.log(result);

+0

こんにちはクエンティン、非常に答えに感謝します。フォローアップの質問をしてもらえますか?私が作者が 'キー引数kが最初の呼び出し(オブジェクト自体が渡されている場所)で定義されていないことを意味するのだろうか?オブジェクト 'a'自体が'匿名関数 'の引数として渡されたのはなぜですか?そのような論理の目的は何ですか? – Thor

+0

私は頭の上から何の用途も考えられません。 (これは何もないわけではありません) – Quentin

+0

時々私はちょうどjavascriptがうまく動作する方法を取得しないでください。 「JSON.stringify」メソッドの実装(つまりソースコード)がどこにあるのか知りたいですか?それが内部的にどのように実装されているか知りたいです。 – Thor

0

キーは、プロパティ名を表す文字列になり、アレイのプロパティを反復処理するときには、配列のインデックスを表す文字列です。

JSON.stringifyイテレータは、オブジェクト内のすべての要素がトップ要素自体から開始されるように機能します。あなたが示したオブジェクトを持つ例えば

var a = { 
    b: 42, 
    c: "42", 
    d: [11,22,33] 
}; 

次のキーと値のために実行されますJSON.stringifyために供給される機能:

  • すべてが{b: 42, c: "42", d: [11,22,33]}が持っていないオブジェクトこれはトップレベル要素以降のキーなので、この場合はk変数はundefinedになります。
  • 42の値は、キーbによってアクセスされます。
  • "42"の値は、キーcによってアクセスされます。
  • dの値で[11,22,33]の値がアクセスされました。
  • 0の値による11の値。
  • 22の値は、キー1によってアクセスされます。
  • 2の値による33の値。
関連する問題