通常这是由循环结构引起的......例如,这很好:
class Project
{
data: {};
children: Array<Project>=[];
}
const project = new Project();
project.children.push(new Project());
console.log(JSON.stringify(project));
但是如果你要给它自己添加一个对象,或者给它的一个孩子添加一个对象……混乱就会随之而来……
class Project
{
data: {};
children: Array<Project>=[];
}
const project = new Project();
project.children.push(new Project());
// No problem
console.log(JSON.stringify(project));
project.children.push(project);
// No end!
console.log(JSON.stringify(project));
这是一个完全有效的内存结构 - 引用绕着圈子转,但最终它是可能的。
当你尝试序列化它时,它永远不会结束,因为每次遇到原始项目时,它都会继续循环,没有结束。
解决方案
您需要映射到非循环类型来序列化数据。您可以像这样处理数据丢失:
class Project
{
data: { example: '4'};
children: Array<Project>=[];
}
const project = new Project();
project.children.push(new Project());
console.log(JSON.stringify(project));
project.children.push(project);
const getCircularReplacer = () => {
const seen = new WeakSet;
return (key, value) => {
if (typeof value === "object" && value !== null) {
if (seen.has(value)) {
return;
}
seen.add(value);
}
return value;
};
};
JSON.stringify(project, getCircularReplacer());