node.js中的只读JSON对象

时间:2014-11-04 11:36:04

标签: json node.js

我需要将用户结果作为JSON对象提供,然后缓存结果。

在某些情况下,用户更改此结果对象,并且修改后的版本可供连续用户使用。为了避免这种情况,我目前正在克隆结果,但这会导致很大的开销,因为它的JSON对象很大。

所以我想让JSON只读取结果并避免克隆过程。如何使JSON对象不可编辑?

2 个答案:

答案 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);