【问题标题】:Why must you extend an object in order to delete a member of it?为什么必须扩展一个对象才能删除它的成员?
【发布时间】:2017-03-04 03:05:44
【问题描述】:

我遇到了一个问题,JSON.stringify 没有保留我添加到使用 $("#myForm").serializeArray(); 创建的对象的属性。

我发现了这个 SO 线程:JSON.stringify is ignoring object properties

该解决方案对我有用——我创建了一个扩展我的mySerializedFormArray 对象的新对象,然后我可以调用delete newObj.toJSON

如果我只是简单地调用delete mySerializedFormArray.toJSON;,我添加的新属性在字符串化过程中仍然会被删除。

为什么当我扩展对象时它会起作用?

编辑:

var DynExport = $('#frmDynExport').serializeArray();

DynExport.IsFooEnabled = $("#hdnFooFlag").val();

var newObj = $.extend({}, DynExport);

delete newObj.toJSON;

var someOtherVar = JSON.stringify(newObj);
DynExport = JSON.stringify(DynExport);

someOtherVar 将包括 IsFooEnabledDynExport 不包括。

【问题讨论】:

  • 您应该发布所涉及的实际代码。
  • @Pointy 完成。我想,因为我只是在我链接的线程中使用了确切的代码,所以并不需要它。
  • 可以通过 Object.freeze 冻结您要删除的对象吗?这在这里很有意义,将所有内容复制到一个新的(非冻结)对象中就可以了。
  • .toJSON 是怎么回事? jQuery 的.serializeArray() 的返回值不会有toJSON 方法,因此您传递给$.extend() 的对象也不会。

标签: javascript jquery json


【解决方案1】:

.serializeArray() 方法返回一个数组(这可能并不奇怪)。当一个数组被序列化为 JSON 时,它最终看起来像这样:

[ value, value, value, ... ]

属性名称是数组中值的数字索引,它们是隐式:第一个值对应元素0,第二个值对应元素1,依此类推。 p>

那么,在这种表示方案中,没有地方可以放置没有数字名称的属性;也就是说,不属于“真实”数组的属性。这些属性在 JavaScript 中当然可以正常工作,但根本无法用 JSON 来表示它们。

通过使用$.exend() 将数组属性(连同您的“IsFooEnabled”属性)复制到一个新的普通对象,您可以解决这个问题,因为普通对象的 JSON 序列化方案明确包括所有属性名称。

【讨论】:

    猜你喜欢
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多