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;
}
он неоптимальный, вроде как пох разбор на стороне клиента, но все же. Есть ли у объектов какой уникальный идентефикатор. Нужно как то сохранять максимальное значение числового индекса