Вход

Просмотр полной версии : Парсинг querystring


Антон Крамолов
11.04.2013, 16:12
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;
}



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

danik.js
11.04.2013, 17:12
queryString.parse(document.cookie, /;\s*/)

Какая связь между queryString и cookie ?

qwerty-клавиатура
12.04.2013, 19:03
формат <разделитель><ключ><равно><закодированное_значение>

qwerty-клавиатура
12.04.2013, 22:49
http://x9a.ru/js/querystring.js