做這樣的事情的正確方法是分別存儲通用的引用對象並通過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 (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.parse'創建一個從字符串表示一個新的結構。無法理解兩個對象是相同的。 –
甚至更多:'克隆=== obj - > false'。 –
克隆=== obj - > false是正常的,因爲克隆的對象是深克隆,即不同的引用。感謝您的回覆。 –