Показать сообщение отдельно
  #1 (permalink)  
Старый 11.04.2013, 16:12
Профессор
Посмотреть профиль Найти все сообщения от Антон Крамолов
 
Регистрация: 11.04.2012
Сообщений: 255

Парсинг querystring
var queryString = new (function() { 
    function parseParam(name, value, params) {
        var pos = name.indexOf('['),
            parts = [];
            
        if (pos == 0) {
            return;
        }
        else if (pos == -1) {
            parts[0] = name;
        }
        else {
            parts[0] = name.substr(0, pos);
            var temp = name.substr(++pos).split('][');
            var i = temp.length - 1;
            temp[i] = temp[i].split(']')[0];
            parts.concat(temp);
        }

        var part,
            cur = params,
            i = 0,
            len = parts.length;

        while (1) {
            part = parts[i];

            if (part == '') {
                var numKeys = Object.keys(cur).filter(function(a) { return a % 1; });
                part = numKeys.length ? Math.max.apply(null, numKeys) + 1 : 0;
            }

            if (++i == len) {
                break;
            }

            if (cur[part] === undefined) {
                cur[part] = {};    
            }                  

            cur = cur[part];
        }

        cur[part] = decodeURIComponent(value);
    }
    
    this.parse = function(str, sep, eq) {
        eq = eq || '=';
        var parts = str.split(sep || '&'),
            i = 0,
            len = parts.length, 
            obj = {};

        while (i < len) {
            var part = parts[i++].split(eq);
            parseParam(part[0], part[1], obj);
        }

        return obj;
    }
    
    function completeParams(params, obj, parts) {       
        for (var i in obj) {                
            if (typeof obj[i] == 'object') {
                parts.push(i);
                completeParams(params, obj[i], parts);
                parts.pop();
                continue;
            }
            
            var temp = parts.concat(i);
            params.push([ temp[0] + ( temp.length > 1 ? '[' + temp.slice(1).join('][') + ']' : '' ), obj[i] ]);
        }
    }
    
    this.stringify = function(obj, sep, eq) {
        sep = sep || '&';
        eq = eq || '=';
        var params = [];
        completeParams(params, obj, []);
        var i = 0, 
            len = params.length, 
            out = '';
        
        while (1) {
            out += params[i][0] + eq + encodeURIComponent(params[i][1]);
            
            if (++i == len) {
                break;
            }
            
            out += sep;
        }
        
        return out;
    }
})();

// Пример: парсим cookies
// queryString.parse(document.cookie, /;\s*/)


Вот я написал что-то типа прототипа, работает как надо, но:
1) я не имею представления как обрабатывать неправильные имена параметров a[][]b, a[ и т.д.
2) как переписать этот фрагмент
if (part == '') {
                var numKeys = Object.keys(cur).filter(function(a) { return a % 1; });
                part = numKeys.length ? Math.max.apply(null, numKeys) + 1 : 0;
            }


он неоптимальный, вроде как пох разбор на стороне клиента, но все же. Есть ли у объектов какой уникальный идентефикатор. Нужно как то сохранять максимальное значение числового индекса
Ответить с цитированием