我需要将用户结果作为JSON对象提供,然后缓存结果。
在某些情况下,用户更改此结果对象,并且修改后的版本可供连续用户使用。为了避免这种情况,我目前正在克隆结果,但这会导致很大的开销,因为它的JSON对象很大。
所以我想让JSON只读取结果并避免克隆过程。如何使JSON对象不可编辑?
答案 0 :(得分:1)
您可以使用Object.freeze():
var obj = {a: 'a', b: 'b'};
var freezeObj = Object.freeze(obj);
freezeObj.a = 'c';
console.log("%j", freezeObj); // prints {"a":"a","b":"b"}
console.log("%j", obj); // prints {"a":"a","b":"b"}
console.log(obj === freezeObj); // prints true
答案 1 :(得分:1)
我们可以在递归中调用Object.freeze。 我为我的用例创建了以下代码段:
var ObjConstrunctor = {}.constructor;
function isJSONObject(obj) {
if (obj === undefined || obj === null || obj === true || obj === false || typeof obj !== "object" || Array.isArray(obj)) {
return false;
} else if (obj.constructor === ObjConstrunctor) {
return true;
} else {
return false;
}
}
function freezeObject(obj) {
if (Array.isArray(obj)) {
Object.freeze(obj);
for (var i = 0; i < obj.length; i++) {
freezeObject(obj[i])
}
} else if (isJSONObject(obj)) {
Object.freeze(obj);
for (var k in obj) {
freezeObject(obj[k])
}
}
}
freezeObject(obj);