11.02.2015, 15:16
|
|
Аспирант
|
|
Регистрация: 02.12.2014
Сообщений: 72
|
|
Чем дробить строку из localstorage, преобразуя её в массив, с помощью split?
Эта строка дополняется пользователями (т.е. значение добавляется сначала в массив, поэтом массив преобразуется в строку, а потом запоминается в localstorage), поэтому она может содержать какие угодно символы. Может быть использовать символ tab? А при внесении записи в localstorage проверять если пользователь ввел символ tab - заменять пробелами. Или ещё идея использовать два пробела, ну а при запоминании ужимать все пробелы до одного. Как лучше?
Последний раз редактировалось Momon, 11.02.2015 в 15:19.
|
|
11.02.2015, 16:13
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,205
|
|
Momon, при формировании строки с разделителем бывает удобно первым символом указывать тот разделитель...
Если он более одного символа можно использовать такую конструкцию
<длина_разделителя>,<разделитель><далее_данные_с_тем_разделителем>
Алгоритм обработки этого не сложный...
- Прочитал число
- Взял разделитель
- Взял данные
- Преобразовал их в массив
|
|
11.02.2015, 17:42
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
Сообщение от Momon
|
Эта строка ... может содержать какие угодно символы.
|
Можно массив перевести в формат JSON. А обратно из локального хранилища извлечь с помощью eval.
function writeArrayToStorage(name, array) {
localStorage[name] = JSON.stringify(array);
}
function readArrayFromStorage(name) {
return eval(JSON.parse(localStorage[name]))
}
writeArrayToStorage('some', ['-x-private', '50%', '$10', '~~~']);
alert(readArrayFromStorage('some'));
Конечно же надо проверить поддерживается ли localStorage
|
|
11.02.2015, 18:53
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от Malleys
|
eval
|
У тебя eval головного мозга.
__________________
В личку только с интересными предложениями
|
|
11.02.2015, 19:02
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Сообщение от Momon
|
Или ещё идея использовать два пробела, ну а при запоминании ужимать все пробелы до одного. Как лучше?
|
Типичный разделитель:
var boundary = "===123456====";
Замечу, что число "=" справо и слево не симметрично
Иногда удобно вместо цифр использовать дату записи в абсолютном формате
|
|
11.02.2015, 19:06
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Сообщение от Malleys
|
А обратно из локального хранилища извлечь с помощью eval.
|
Ну есть parseJson()
2. Он типично дольше чем split(), при длине более килобайта, особенно если данные чисто массив,
Есть и привередливость Json к корректности, ибо сбой хоть в одном из элементов рушит конструкцию.
Типично данных на Storage я к примеру загружаю более 100 кб, меньшие данные удобней подгружать кешированным json скриптом
Последний раз редактировалось Deff, 11.02.2015 в 19:09.
|
|
11.02.2015, 19:40
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
Malleys,
Сообщение от Malleys
|
Можно массив перевести в формат JSON. А обратно из локального хранилища извлечь с помощью eval.
Конечно же надо проверить поддерживается ли localStorage
|
А эвал то зачем?
var a = [1,2,3];
var str = JSON.stringify(a);
alert(str);
alert(JSON.parse(str).join(","))
|
|
11.02.2015, 20:12
|
|
Аспирант
|
|
Регистрация: 02.12.2014
Сообщений: 72
|
|
Deff,
А почему это количество знаков равно должно быть не одинаково? Да и такой длинный разделитель будет ведь много места занимать в webstorage, я думал чем короче придумаю разделитель тем лучше.
Последний раз редактировалось Momon, 11.02.2015 в 20:18.
|
|
11.02.2015, 21:33
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от Deff
|
сбой хоть в одном из элементов
|
С каких пор localStorage бьет данные? С каких пор HTTP бьет передаваемые данные? Я что-то пропустил?
__________________
В личку только с интересными предложениями
|
|
12.02.2015, 00:40
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
Я думаю нет необходимости соединять строки массива при помощи какого-то символа, поскольку этот символ может содержаться в строке.
По моему стоит использвать лучше этот символ в качестве соединителя значения ключа localStorage. Например имя массива + символ + индекс строки из массива.
Для простоты записи и чтения по такой системе будет хорошо иметь два метода: 1. у массива toLocalStorage для записи и 2. toArray для обратной манипуляций.
var LocalStorage = (function() {
function LocalStorage(name) {
if(!name)
throw new Error('Name of storage isn\'t exist');
this.name = name;
LocalStorage.Names.push[name];
this.length = parseInt(localStorage[this.name + '.length'] || 0);
localStorage[this.name + '.length'] = this.length;
}
function each(iterator, context) {
for(var index = 0; index < this.length; index++) {
iterator.call(context, localStorage[this.name + '.' + index], index);
}
return this;
}
function push(string) {
localStorage[this.name + '.' + this.length++] = string;
localStorage[this.name + '.length'] = this.length;
return this;
}
function select(index) {
return localStorage[this.name + '.' + index];
}
function toArray() {
var result = [];
this.each(function(string) {
result.push(string);
});
return result;
}
LocalStorage.prototype = {
each: each,
push: push,
select: select,
toArray: toArray
};
LocalStorage.Names = [];
return LocalStorage;
})();
Array.prototype.toLocalStorage = function(name) {
var __localStorage = new LocalStorage(name);
for(var i = 0; i < this.length; i++)
__localStorage.push(this[i]);
return __localStorage;
};
/*********************************/
// Метод массива toLocalStorage записывает массив в localStorage
var ls = ['Slagt ham! Kristenmands søn har dåret', 'Dovregubbens veneste mø!', 'Slagt ham!', 'Isvand i blodet!'].toLocalStorage('my-dump');
// Метод LocalStorage toArray записывает из хранилища в массив
alert(ls.toArray());
Сообщение от tsigel
|
А эвал то зачем?
|
typeof readArrayFromStorage('some') оказалось равным 'string'
|
|
|
|