2014-11-04 5 views
4

Мне нужно дать пользователям результат как объект JSON, и я кэширую результат.Объект JSON только для чтения в node.js

В некоторых случаях пользователи меняют этот объект результатов, а измененная версия доступна для последовательных пользователей. Чтобы этого избежать, в настоящее время я клонирую результат, но это приводит к тяжелым накладным расходам как к очень большому объекту JSON.

Поэтому я хочу, чтобы JSON читал только для того, чтобы дать результат и избежать процесса клонирования. Как сделать объект JSON недоступным для редактирования?

ответ

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 
+0

Он работает в тестировании. На больших данных (около 500 полей, которые являются моим тестовым случаем), занимает 7 мс. Я ищу что-то, что делает это через 1-2 мс. Но его еще лучший вариант я получил. Клонирование заняло около 40-50 мс. – vashishatashu

+0

Спасибо за информацию ... хорошо знать ... – Ben

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); 
Смежные вопросы