gpt4 book ai didi

javascript - 字符串化(转换为 JSON)具有循环引用的 JavaScript 对象

转载 作者:IT老高 更新时间:2023-10-28 12:43:49 26 4
gpt4 key购买 nike

我有一个包含循环引用的 JavaScript 对象定义:它有一个引用父对象的属性。

它还有一些我不想传递给服务器的功能。我将如何序列化和反序列化这些对象?

我读到最好的方法是使用 Douglas Crockford 的 stringify。但是,我在 Chrome 中收到以下错误:

TypeError: Converting circular structure to JSON

代码:

function finger(xid, xparent){
this.id = xid;
this.xparent;
//other attributes
}

function arm(xid, xparent){
this.id = xid;
this.parent = xparent;
this.fingers = [];

//other attributes

this.moveArm = function() {
//moveArm function details - not included in this testcase
alert("moveArm Executed");
}
}

function person(xid, xparent, xname){
this.id = xid;
this.parent = xparent;
this.name = xname
this.arms = []

this.createArms = function () {
this.arms[this.arms.length] = new arm(this.id, this);
}
}

function group(xid, xparent){
this.id = xid;
this.parent = xparent;
this.people = [];
that = this;

this.createPerson = function () {
this.people[this.people.length] = new person(this.people.length, this, "someName");
//other commands
}

this.saveGroup = function () {
alert(JSON.stringify(that.people));
}
}

这是我为这个问题创建的测试用例。这段代码中有错误,但本质上我在对象中有对象,并且传递给每个对象的引用以显示创建对象时父对象是什么。每个对象还包含我不希望字符串化的函数。我只想要 Person.Name 等属性。

我如何在发送到服务器之前进行序列化,并在假设传回相同的 JSON 的情况下对其进行反序列化?

最佳答案

循环结构错误发生在对象的属性是对象本身直接(a -> a)或间接(a -> b -> a)。

为了避免错误消息,告诉 JSON.stringify 在遇到循环引用时该怎么做。例如,如果您有一个人指向另一个人(“ parent ”),而该人可能(也可能不)指向原始人,请执行以下操作:

JSON.stringify( that.person, function( key, value) {
if( key == 'parent') { return value.id;}
else {return value;}
})

stringify 的第二个参数是一个过滤函数。在这里,它只是将引用的对象转换为其 ID,但您可以自由地做任何您想做的事情来破坏循环引用。

您可以使用以下代码测试上述代码:

function Person( params) {
this.id = params['id'];
this.name = params['name'];
this.father = null;
this.fingers = [];
// etc.
}

var me = new Person({ id: 1, name: 'Luke'});
var him = new Person( { id:2, name: 'Darth Vader'});
me.father = him;
JSON.stringify(me); // so far so good

him.father = me; // time travel assumed :-)
JSON.stringify(me); // "TypeError: Converting circular structure to JSON"
// But this should do the job:
JSON.stringify(me, function( key, value) {
if(key == 'father') {
return value.id;
} else {
return value;
};
});

顺便说一句,我会为“parent”选择一个不同的属性名称,因为它是许多语言(和 DOM)中的保留字。这往往会导致困惑......

关于javascript - 字符串化(转换为 JSON)具有循环引用的 JavaScript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10392293/

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