Аналог PHP функции serialize() для JavaScript

Сериализирует данные, то есть представляет их в виде строки, которую можно сохранить в файле или, например, в базе данных. Функцию удобно использовать для хранения массивов данных.

function serialize(mixed_value) {
  var _getType = function(inp) {
    var type = typeof inp, match;
    var key;
    if(type == 'object' && !inp) {
      return 'null';
    }
    if(type == 'object') {
      if(!inp.constructor) {
        return 'object';
      }
      var cons = inp.constructor.toString();
      if(match = cons.match(/(\w+)\(/)) {
        cons = match[1].toLowerCase();
      }
      var types = ['boolean', 'number', 'string', 'array'];
      for(key in types) {
        if(cons == types[key]) {
          type = types[key];
          break;
        }
      }
    }
    return type;
  };
  var type = _getType(mixed_value);
  var val, ktype = '';
  switch(type) {
    case 'function':
      val = '';
      break;
    case 'undefined':
      val = 'N';
      break;
    case 'boolean':
      val = 'b:' + (mixed_value ? '1' : '0');
      break;
    case 'number':
      val = (Math.round(mixed_value) == mixed_value ? 'i' : 'd') + ':' + mixed_value;
      break;
    case 'string':
      val = 's:' + get_length(mixed_value) + ':"' + mixed_value + '"';
      break;
    case 'array':
    case 'object':
      val = 'a';
      var count = 0;
      var vals = '';
      var okey;
      var key;
      for(key in mixed_value) {
        ktype = _getType(mixed_value[key]);
        if(ktype == 'function') {
          continue;
        }
        okey = (key.match(/^[0-9]+$/) ? parseInt(key) : key);
        vals += serialize(okey) + serialize(mixed_value[key]);
        count++;
      }
      val += ':' + count + ':{' + vals + '}';
      break;
  }
  if(type != 'object' && type != 'array') val += ';';
  return val;
}
 
function get_length(val){
  var counter = 0;
  for(i=0;val.length>i;i++)
    if(/[абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ]/.test(val[i])) {
      counter += 2;
    } else {
      counter++;
    }
  return counter;
}
Внимание! Все действия, описанные выше, вы выполняете на свой страх и риск. Автор не несет никакой ответственности за любой вред, причиненный пользователю или третьим лицам в результате использования материалов, программного обеспечения и другой информации, размещенной на данной странице.
Полезно? Поддержите! Это мотивирует автора к дальнейшим публикациям.

Обсуждение

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *