Локальное хранилище HTML5 строит в строку и сохраняет ссылку на КАЖДЫЙ объект

#javascript #json #html #local-storage

#javascript #json #HTML #локальное хранилище

Вопрос:

Со следующим JSON:

 var myObj = {name: 'my obj', does: 'nothing'};
var myObjArr = [myObj, myObj, myObj];
  

При сохранении myObjArr в локальное хранилище myObj JSON записывается три раза, занимая в 3 раза больше места для хранения, т.е:

 "[{"name":"my obj","does":"nothing"},{"name":"my obj","does":"nothing"},{"name":"my obj","does":"nothing"}]"
  

Очевидно, что это создаст проблемы с масштабируемостью. Кто-нибудь может порекомендовать оптимальное решение? До сих пор мне приходилось прибегать к использованию идентификаторов, а-ля реляционные базы данных.

 var objects = {0: {name: 'my obj', does: 'nothing'}};
var myObjArr = [{obj: 0}, {obj: 0}, {obj: 0}];
  

Обновление — вопрос в том, как представить эту иерархию в локальном хранилище, когда все данные в конечном итоге хранятся в виде строк ключей / значений. Обращение к концепциям реляционных баз данных кажется старомодным.

Комментарии:

1. Я предполагаю, что ваш пример объекта иногда будет меняться? Поскольку похоже, что у вас просто три раза один и тот же объект — это всегда будет количество идентичных элементов или они изменятся?

2. @Henry это всего лишь пример, показывающий, что если объект содержит более одной ссылки на другой объект, он будет строковаться для каждой ссылки, которая тратит пространство, плюс вы теряете соединение «многие к одному» при повторном анализе JSON из локального хранилища… наверняка должен быть более чистый способ?

Ответ №1:

Более подходящей технологией было бы использовать IndexedDB в качестве хранилища объектов, однако она пока не поддерживается многими браузерами.

РЕДАКТИРОВАТЬ: Вы захотите просмотреть документацию по алгоритму структурированного клонирования, который используется при копировании объекта в IndexedDB — похоже, что ссылки поддерживаются для каждой записи, но добавление нескольких записей не приведет к тому, что каждая запись будет ссылаться на объекты, которые были совместно использованы в пространстве памяти JavaScript.