gpt4 book ai didi

javascript - 序列化包含循环对象值的对象

转载 作者:行者123 更新时间:2023-11-28 07:36:41 25 4
gpt4 key购买 nike

我有一个对象(解析树),其中包含子节点,这些子节点是对其他节点的引用。

我想使用 JSON.stringify() 序列化此对象,但我得到了

TypeError: cyclic object value

因为我提到的结构。

我该如何解决这个问题?对我来说,这些对其他节点的引用是否在序列化对象中表示并不重要。

另一方面,在创建对象时从对象中删除这些属性似乎很乏味,我不想对解析器进行更改(narcissus)。

最佳答案

使用stringify的第二个参数,replacer function ,排除已经序列化的对象:

var seen = [];

JSON.stringify(obj, function(key, val) {
if (val != null && typeof val == "object") {
if (seen.indexOf(val) >= 0) {
return;
}
seen.push(val);
}
return val;
});

http://jsfiddle.net/mH6cJ/38/

正如其他评论中正确指出的那样,此代码删除了所有“看到”的对象,而不仅仅是“递归”对象。

例如,对于:

a = {x:1};
obj = [a, a];

结果将不正确。如果您的结构是这样的,您可能需要使用 Crockford 的 decycle或者这个(更简单的)函数,它只是用 null 替换递归引用:

function decycle(obj, stack = []) {
if (!obj || typeof obj !== 'object')
return obj;

if (stack.includes(obj))
return null;

let s = stack.concat([obj]);

return Array.isArray(obj)
? obj.map(x => decycle(x, s))
: Object.fromEntries(
Object.entries(obj)
.map(([k, v]) => [k, decycle(v, s)]));
}

//

let a = {b: [1, 2, 3]}
a.b.push(a);

console.log(JSON.stringify(decycle(a)))

关于javascript - 序列化包含循环对象值的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28518506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com