#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.