Мне недавно пришлось сохранять огромные объекты JSON в localStorage.
Во-первых, да, они остаются в юникоде. Но не пытайтесь сохранить что-то вроде объекта прямо в локальном хранилище. Это должна быть строка.
Вот некоторые методы сжатия, которые я использовал (которые, казалось, хорошо работали в моем случае) перед преобразованием моего объекта в строку:
Любые числа можно преобразовать из основания 10 в основание 36, выполнив что-то вроде (+ num) .toString (36). Например, число 48346942 будет тогда «ss8qm», что на 1 символ (включая кавычки) меньше. Возможно, что добавление кавычек фактически увеличит количество символов. Таким образом, чем больше число, тем лучше. Чтобы преобразовать его обратно, вы должны сделать что-то вроде parseInt ("ss8qm", 36).
Если вы храните объект с любой клавишей, которая будет повторяться, лучше всего создать поисковый объект, в котором вы назначите сокращенную клавишу оригиналу. Итак, для примера, если у вас есть:
{
name: 'Frank',
age: 36,
family: [{
name: 'Luke',
age: 14,
relation: 'cousin'
}, {
name: 'Sarah',
age: 22,
relation: 'sister'
}, {
name: 'Trish',
age: 31,
relation: 'wife'
}]
}
Тогда вы можете сделать это:
{
// original w/ shortened keys
o: {
n: 'Frank',
a: 36,
f: [{
n: 'Luke',
a: 14,
r: 'cousin'
}, {
n: 'Sarah',
a: 22,
r: 'sister'
}, {
n: 'Trish',
a: 31,
r: 'wife'
}]
},
// lookup
l: {
n: 'name',
a: 'age',
r: 'relation',
f: 'family'
}
}
Опять же, это окупается с размером. И повторение. В моем случае это сработало очень хорошо. Но это зависит от предмета.
Все они требуют, чтобы функция уменьшалась, а одна - расширялась обратно.
Кроме того, я бы порекомендовал создать класс, который будет использоваться для хранения и извлечения данных из локального хранилища. Я столкнулся с нехваткой места. Таким образом, запись потерпит неудачу. Другие сайты также могут записывать в локальное хранилище, которое может забрать часть этого пространства. См. этот пост для более подробной информации.
В том классе, который я создал, я сначала попытался удалить любой предмет с данным ключом. Затем попробуйте setItem. Эти две строки обернуты пробным уловом. Если происходит сбой, предполагается, что хранилище заполнено. Затем он очистит все в localStorage в попытке освободить место для него. После сброса он попытается снова установить элемент. Это тоже завернуто в попытку поймать. Так как он может потерпеть неудачу, если сама строка больше, чем то, что может обработать localStorage.
РЕДАКТИРОВАТЬ: Кроме того, вы столкнетесь со сжатием LZW многие люди упоминают. Я реализовал это, и это работало для маленьких строк. Но с большими строками он начал бы использовать недопустимые символы, что приводило к повреждению данных. Так что будьте осторожны, и если вы идете в этом направлении, тестовый тестовый тест