Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Чем дробить строку из localstorage, преобразуя её в массив, с помощью split? (https://javascript.ru/forum/misc/53617-chem-drobit-stroku-iz-localstorage-preobrazuya-ejo-v-massiv-s-pomoshhyu-split.html)

Momon 11.02.2015 15:16

Чем дробить строку из localstorage, преобразуя её в массив, с помощью split?
 
Эта строка дополняется пользователями (т.е. значение добавляется сначала в массив, поэтом массив преобразуется в строку, а потом запоминается в localstorage), поэтому она может содержать какие угодно символы. Может быть использовать символ tab? А при внесении записи в localstorage проверять если пользователь ввел символ tab - заменять пробелами. Или ещё идея использовать два пробела, ну а при запоминании ужимать все пробелы до одного. Как лучше?

ksa 11.02.2015 16:13

Momon, при формировании строки с разделителем бывает удобно первым символом указывать тот разделитель... ;)
Если он более одного символа можно использовать такую конструкцию

<длина_разделителя>,<разделитель><далее_данные_с_тем_разделителем>

Алгоритм обработки этого не сложный...
- Прочитал число
- Взял разделитель
- Взял данные
- Преобразовал их в массив

Malleys 11.02.2015 17:42

Цитата:

Сообщение от Momon (Сообщение 356111)
Эта строка ... может содержать какие угодно символы.

Можно массив перевести в формат 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

danik.js 11.02.2015 18:53

Цитата:

Сообщение от Malleys
eval

У тебя eval головного мозга.

Deff 11.02.2015 19:02

Цитата:

Сообщение от Momon
Или ещё идея использовать два пробела, ну а при запоминании ужимать все пробелы до одного. Как лучше?

Типичный разделитель:
var boundary = "===123456====";
Замечу, что число "=" справо и слево не симметрично
Иногда удобно вместо цифр использовать дату записи в абсолютном формате

Deff 11.02.2015 19:06

Цитата:

Сообщение от Malleys
А обратно из локального хранилища извлечь с помощью eval.

Ну есть parseJson()
2. Он типично дольше чем split(), при длине более килобайта, особенно если данные чисто массив,
Есть и привередливость Json к корректности, ибо сбой хоть в одном из элементов рушит конструкцию.
Типично данных на Storage я к примеру загружаю более 100 кб, меньшие данные удобней подгружать кешированным json скриптом

tsigel 11.02.2015 19:40

Malleys,
Цитата:

Сообщение от Malleys
Можно массив перевести в формат JSON. А обратно из локального хранилища извлечь с помощью eval.

Конечно же надо проверить поддерживается ли localStorage

А эвал то зачем?

var a = [1,2,3];
var str = JSON.stringify(a);

alert(str);
alert(JSON.parse(str).join(","))

Momon 11.02.2015 20:12

Deff,
А почему это количество знаков равно должно быть не одинаково? :blink: Да и такой длинный разделитель будет ведь много места занимать в webstorage, я думал чем короче придумаю разделитель тем лучше.

danik.js 11.02.2015 21:33

Цитата:

Сообщение от Deff
сбой хоть в одном из элементов

С каких пор localStorage бьет данные? С каких пор HTTP бьет передаваемые данные? Я что-то пропустил?

Malleys 12.02.2015 00:40

Я думаю нет необходимости соединять строки массива при помощи какого-то символа, поскольку этот символ может содержаться в строке.
По моему стоит использвать лучше этот символ в качестве соединителя значения ключа 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'


Часовой пояс GMT +3, время: 06:01.