圖片來自 Christopher Gower

JavaScript 小技巧:JSON.stringify()

本文轉載自 Jerry 的 Medium

JavaScript Tricks 筆記。

做為 JavaScipt 開發人員,我們經常會用到 console.log() 來進行 debug,但有時候 console.log() 會沒打印出預期的結果:

// 呈現結果
[object Object]

因為從物件到字符串的默認轉換是 [object Object],這時候可以利用 JavaScipt 內建的方法 JSON.stringify() 來幫忙,將物件或值轉變為 JSON 字串:

const person = { name : "Jerry", age : 29 }

console.log(JSON.stringify(person));

// 呈現結果
"{ "name" : "Jerry", "age" : 29 }"

除了使用 stringify() 的 function 來幫助我們開發,JSON.stringify() 還可以額外帶入兩個可選的參數,第一個是替換參數(replacer),第二個則是間隔參數(space)

替換參數(Array)

一個物件 food,當我們想知道 food 的名稱,於是將其打印如下:

console.log(JSON.stringify(food));

// 呈現結果
"{'id':1,'type':'donut','name':'Cake','ppu':0.55,'batters':{'id':1,'type':'donut','name':'apple','ppu':0.55,'batters':{'batter':[{'id':2001,'type':'candy'},{'id':2002,'type':'Chocolate'},{'id':2003,'type':'Blueberry'},{'id':2004,'type':'Devil’s Food'}]},'topping':[{'id':3001,'type':'None'},{'id':3002,'type':'Glazed'},{'id':3003,'type':'Chocolate'},{'id':3004,'type':'Maple'}]}}"

Console 的結果出現大量無用的信息,很不容易找出關鍵的 key(name),這種情況在物件結構越龐大時越明顯,這時將替換參數加入 JSON.stringify()

console.log(JSON.stringify(food,['type', 'name']));

// 呈現結果
"{'type':'donut','name':'Cake'}"

將所需的 key 值作為陣列傳遞給第二個參數 (replacer),打印出需的內容。

替換參數(Function)

Replacer 也可以把 function 作為參數傳遞。Function 可以帶入兩個參數,keyvalue,其中編寫的邏輯用於過濾內容,如果返回 undefined,則不會回傳對應的 key-value:

function replacer(key, value) {
  if (typeof value === "string") {
    return undefined;
  }
  return value;
}

const person = { name : "Jerry", age : 29 }

console.log(JSON.stringify(person, replacer));

// 呈現結果
"{'age':29}"

間隔參數(Number)

Space 控制結果字符串裡面的間距,如果參數是數字,則字符串化中的每個級別都將以此數量的空格字符縮進,數字的話最多可以 10,大於 10 也會取 10,最小 1:

// Note:'-' 代表空格
console.log(JSON.stringify(person, null, 3));

// 呈現結果
// "{
// ---'name': 'Jerry',
// ---'age': 29
// }"

間隔參數(String)

如果 space 是字串,上面顯示的空格會被替換掉,一樣最多可以十個字:

console.log(JSON.stringify(person, null, '$$'));

//呈現結果
// "{
// $$'name': 'Jerry',
// $$'age': 29
// }"

toJSON() 方法

一個物件擁有 toJSON 的屬性,那麼該 toJSON() 方法就會覆蓋該對象默認的 stringify 行為,JSON.stringify() 返回 toJSON() 的結果並將其字符串化,而不是將整個物件轉換為字符串:

const person = {
  name : "Jerry",
  age : 29,
  toJSON () {
    return `Now I am '${this.name}' and age is ${this.age}`;
  }
}

console.log(JSON.stringify(person));

//呈現結果
"'Now I am 'Jerry' and age is 29'"

不是打印整個物件,僅打印出 toJSON() function 的結果。

作者:Jerry

菜鳥軟體工程師 In Taiwan,原本是個數學教師,後來發現寫程式是很有挑戰性跟成就感的一件事,便一頭栽入了進去,喜愛獲取新的知識與資訊,期待自己能用通俗易懂的方式來講解程式疑難。

本文由 INFOLINK 聯騰資訊股份有限公司提供,聯騰資訊專注於為零售與餐飲產業提供智慧化的系統解決方案,以 ERP 為核心為客戶開拓 E 化應用,與 POS、BI、EC 等應用實現無縫整合,我們在此分享我們對產業與技術的觀點,歡迎與我們交流或追蹤我們。