javaScript:使用JSON解析字符串对象。parse删除引用

马丁·安东诺夫(Martin Antonov)

我正在尝试深克隆一个对象,用k = JSON.parse(JSON.stringify(a))说“ a”。使用字符串化方法很重要,因为我试图将对象保存到文件中,然后从文件中加载。

我偶然发现了克隆对象上引用的问题,如下所示:

var obj={};
obj.importantProperty={s:2};
obj.c=obj.importantProperty;
obj.d=obj.importantProperty;
console.log( obj.c === obj.d ); // Returns true

var cloned = JSON.parse(JSON.stringify(obj));
console.log( cloned.c === cloned.d ); // Returns false
在使用JSON.parse时,我需要保留引用,在上面的示例中,引用不是。在我的项目中,对象要复杂得多,但最终归结为上面的示例。

在此先感谢帮助我的人:)

伦霍尔姆

进行此类操作的正确方法是分别存储公共引用的对象并通过ID对其进行引用。

例如,您可以将importantProperty对象保存在数组中并将索引用作ID:

var importantProperties = [
  { s: 1 },
  { s: 2 },
  { s: 3 }
];

var obj = {};
obj.importantProperty = importantProperties[1];
obj.c = obj.importantProperty;
obj.d = obj.importantProperty;

然后,当对对象进行字符串化时,将引用的对象替换为其索引:

var stringified = JSON.stringify(obj, function(key, value) {
  if (key) {
    return importantProperties.indexOf(value);
  }
  return value;
});
console.log(stringified);
// prints {"importantProperty":1,"c":1,"d":1}

然后,当您解析时,只需简单地逆转过程即可恢复引用:

var parsed = JSON.parse(stringified, function(key, value) {
  if (key) {
    return importantProperties[value];
  }
  return value;
});
console.log(parsed.c === parsed.d && parsed.d === parsed.importantProperty);
// prints true

现在,假设示例中的所有属性obj都是importantProperties数组中的对象,则以上示例适用于您的示例代码如果不是这种情况,并且只有某些属性是importantProperties对象,则在替换/恢复时需要检查该属性
假设只有“importantProperty”,“c”和“d”属性是这样的对象:
if (['importantProperty', 'c', 'd'].includes(key))而不是仅仅if (key)

如果这还不够好,并且您不希望属性名称与该值是否是importantProperties对象有任何关系,则需要在值中与标识符一起指出。这是如何完成此操作的示例:

// Replacing
JSON.stringify(obj, function(k, value) {
  if (importantProperties.includes(value)) {
    return 'ImportantProperty['
      + importantProperties.indexOf(value)
      + ']';
  }
  return value;
});

// Reviving
JSON.parse(stringified, function(k, value) {
  if (/^ImportantProperty\[\d+\]$/.test(value)) {
    var index = Number( value.match(/\d+/)[0] );
    return importantProperties[index];
  }
  return value;
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章