2017-07-26 15 views
0

我目前正在學習JavaScript的系列「你不知道js」。傳遞一個函數到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]}" 

注:在功能替代品的情況下,關鍵參數k的未定義 爲第一個調用(其中一個對象本身被傳入)。 if語句過濾掉名爲「c」的屬性。字符串化爲 遞歸,因此[1,2,3]數組將其每個值(1,2和3) 作爲v傳遞給替換器,索引(0,1和2)爲k。

所以我用下面的代碼出來,旨在從JSON.stringify結果刪除值22

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

我期待的結果是"{"b":42,"c":"42","d":[11,33]}"

然而,結果卻反而"{"b":42,"c":"42","d":[11,22,33]}"(你可以在屬性的C指數1看到的,值22沒有被過濾掉)

明白我錯過了筆者所說的嗎?我錯過了什麼嗎?

+0

@Kaddath - 否替換函數以遞歸方式運行。 – 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訪問。
  • [11,22,33]值由密鑰d訪問。
  • 11值由密鑰0訪問。
  • 22值通過密鑰1訪問。
  • 33值通過密鑰2訪問。