我们有一个javascript对象,它包含(a)普通属性(字符串,其他对象的数组,日期),(b)方法,(c)属于jQuery对象的属性。
我们需要将父对象和所有嵌套对象序列化为JSON字符串以发送到服务器。作为此过程的一部分,我们希望删除服务器不需要的属性,以及任何jQuery对象(由于循环引用而无法序列化)。
我们尝试使用"去除剂" JSON.stringify的参数但它似乎忽略了嵌套对象。我们有lodash可用。我们应该考虑采用什么方法?
var Form = function ($elem, config) {
this.$elem = $elem;
this.config = config;
this.init();
};
$.extend(Form.prototype, {
constructor: Form,
config: null,
$elem: null,
categoryid: null,
$sectionModal: null,
sections: [],
$sectionList: null,
addSection: function (data) {
. . .
},
validate: function () {
. . .
},
serialize: function () {
console.log(JSON.stringify(this, function (key, value) {
if (value instanceof jQuery) {
return undefined;
}
return value;
}));
},
init: function () {
this.sections.push(new Section(1, "Section one"));
this.sections.push(new Section(2, "Section two"));
}
});
答案 0 :(得分:0)
您可以为瞬态属性使用约定,例如以$
开头的属性名称。
var o = {
a: "a",
b: 1,
c: [2, 3],
d: {
a: 1,
$e: "not this one"
},
f: function(y) {},
$e: "not this one"
};
var serialize = function(x) {
return JSON.stringify(x, function(k, v) {
if (!k.startsWith("$"))
return v;
});
};
console.log(serialize(o));
// {"a":"a","b":1,"c":[2,3],"d":{"a":1}}
答案 1 :(得分:0)
我们已经解决了原始问题的根源,尽管它提出了其他问题。请注意以下代码(也在https://jsfiddle.net/osy4cook/1/)。似乎属性仅包含在序列化中,如果它们的值在对象构造函数中初始化或通过对象上的方法设置,但是如果通过将属性添加到原型来初始化属性,则不会。我确定有一个简单的解释 - 有谁知道它是什么?
编辑:我们有两个理由来定义原型的属性。首先,所以"类的所有方法/属性"为清楚起见,在同一个地方定义。第二,提供默认值。我们忽略的是构造函数的属性特定于用它创建的每个对象,而原型的属性由ALL对象共享。显然序列化对象只是忽略原型上的属性。 (来源:Why defining properties in the prototype is considered an antipattern)
var Section = function(id, title) {
this.id = id;
this.title = title;
}
var Form = function () {
this.sections = [];
this.myvar1 = 123;
this.init();
};
$.extend(Form.prototype, {
constructor: Form,
myvar1: null,
myvar2: null,
myvar3: 999,
$sectionModal: $("<div></div>"),
sections: [],
myarray: [],
addSection: function (data) {
//. . .
},
serialize: function () {
console.log(JSON.stringify(this, function (key, value) {
if (value instanceof jQuery) {
return undefined;
}
return value;
}));
},
init: function () {
this.myvar2 = 999;
this.sections.push(new Section(1, "Section one"));
this.myarray.push(new Section(2, "Section two"));
this.serialize();
}
});
var form = new Form();
结果...
{"sections":[{"id":1,"title":"Section one"}],"myvar1":123,"myvar2":999}