在删除某些属性时序列化嵌套的javascript对象

时间:2015-09-22 09:24:45

标签: javascript jquery json

我们有一个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"));
    }
});

2 个答案:

答案 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}