做这样的事情的正确方法是分别存储通用的引用对象并通过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是正常的,因为克隆的对象是深克隆,即不同的引用。感谢您的回复。 –