簡體   English   中英

javaScript:使用JSON.parse解析字符串化對象會刪除引用

[英]javaScript: Parsing a stringified object with JSON.parse removes references

我試圖深度克隆一個對象,用k = JSON.parse(JSON.stringify(a))說“a”。 我使用stringify方式很重要,因為我試圖將對象保存到文件中然后從中加載。

我偶然發現了克隆對象的引用問題,如下所示:

 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;
});

使用JSON無法實現所需的結果,因為JSON格式只能包含有限的數據類型( http://json.org/ ),當您將對象字符串化為JSON時,某些信息會丟失。

可能還有一些其他類型的序列化技術,但我建議你尋找另一種存儲數據的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM