JSON.stringify() 方法
JSON.stringify() 方法用于将 JavaScript 对象或者值转换为 JSON 格式,如果指定了替换函数,则可选择替换值,或者如果指定了替换数组,则可选择仅包含指定的属性。
Replacer 是一个修改字符串化过程行为的函数,或者一个字符串和数字对象的数组。
如果 replacer 的值为 null 或者未给出,则所有对象的属性都包含在结果 JSON 字符串中。
循环结构不是在 JSON 中,而是在正在转换为 JSON 的对象中。
循环结构来自包含引用原始对象的对象的对象。
使用 JSON.stringify 可以将循环结构转换为 JSON 格式。
将它与自定义替换器一起使用,如本例所示:
//Circular reference
let circ = {
a: 1
};
circ.a = circ;
//请注意,不应通过重复调用 JSON.stringify 来重用缓存
let cache = [];
JSON.safeStringify = (circ, (key, val) => {
if (typeof val === 'object' && val !== null) {
//Duplicate reference found, reset key
if (cache.includes(val)) return;
//Save value in our collection
cache.push(val);
}
return val;
});
//cache = null; //Enable garbage collection
console.log('cache', JSON.safeStringify(cache));
给定示例中的替换器不是 100% 正确的,这取决于我们对“重复”的定义。
在这种情况下,一个值被丢弃,但它使用自定义替换器,并跟踪解析的对象值:
let a = {
b: 1
}
let opt = {};
opt.one = a;
opt.two = a;
//one和two指向同一个对象,但两个被丢弃:JSON.stringify(opt,…);
//作为ES6中编写的实用函数,请使用以下命令:
//安全地处理循环引用
JSON.safeStringify = (obj, indent = 2) => {
let cache = [];
const retVal = JSON.stringify(
obj,
(key, val) =>
typeof val === "object" && val !== null ?
cache.includes(val) ?
undefined //找到重复的引用重置键
:
cache.push(val) && val //Store value in our collection
:
val,
indent
);
cache = null;
return retVal;
};
console.log('options', JSON.safeStringify(opt));
日期:2020-06-02 22:16:23 来源:oir作者:oir
