JSON.stringify 竟然還能這樣用?

JSON.stringify 這個 API 想必你們都用過,能夠幫助咱們將數據解析成字符串類型,以下的例子:數組

let obj = {
    name: 'lxcan',
    age: 18,
    hobby: 'sleep',
    money: null
};
JSON.stringify(obj);
// '{"name":"lxcan","age":18,"hobby":"sleep","money":null}'

想必這樣的寫法你們都知道,可是其實 JSON.stringify 總共接受三個參數。函數

第二個參數能夠傳入一個數組或者函數。code

先來看下傳入數組結果會是什麼?字符串

// 第二個參數傳入一個數組
JSON.stringify(obj, ['name', 'age']);
// '{"name":"lxcan","age":18}'

能夠看到,當傳入數組的時候,只有數組內的屬性名纔會被正常序列化。string

那麼當第二個參數傳入函數會是什麼呢?序列化

// 第二個參數傳入一個函數
let obj1 = {
    name: new Set([1])
};
JSON.stringify(obj1, (key, value) => {
  return value instanceof Set ? [...value] : value
});
// 正常序列化是 "{"name":{}}"
// 例子中的輸出爲 "{"name":[1]}"
// 第二個參數傳入一個函數
let obj2 = {
    lxc: new Map([['name', 'lxcan'], ['age', 18]])
};
JSON.stringify(obj2, (key, value) => {
  return value instanceof Map ? [...value] : value
});
// 正常序列化是 "{"lxc":{}}"
// 例子中的輸出爲 "{"lxc":[["name","lxcan"],["age",18]]}"

咱們都知道 JSON.stringify 是不能處理某些值的,就好比例子中的 Set/Map 類型的值就不能正常序列化。可是其實咱們能夠經過傳入函數的方式幫助咱們將 Set/Map 類型的值轉換爲數組類型,從而使得數據可以被正常序列化。數據

第三個參數能夠傳入數字或者字符串類型,該參數用於美化輸出。正常來講輸出的結果都是一行文本,在數據量小的時候閱讀起來沒啥壓力,可是當數據量龐大的時候就會增長閱讀難度。這個參數在這種時候就很是有用。co

// 第三個參數傳入數字
JSON.stringify(obj, null, 2);
// {
//   "name": "lxcan",
//   "age": 18,
//   "hobby": "sleep",
//   "money": null
// }

當傳入數字時,每一個屬性都會換行而且帶有縮進空格。字符

// 第三個參數傳入字符串
JSON.stringify(obj, null, '--');
// {
// --"name": "lxcan",
// --"age": 18,
// --"hobby": "sleep",
// --"money": null
// }

當傳入字符串時,每一個屬性照樣都會換行而且在開頭加上你傳入的字符串。gif

以上就是本篇文章的內容了,雖然這單純屬於 API 範疇的知識,可是大部分同窗應該並不知道 JSON.stringify 還擁有這樣的能力。

相關文章
相關標籤/搜索