Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- querystring = new (function QueryString() {
- var self = this;
- /**
- * Декодирует компонент URI.
- *
- * @param {string} str Исходная строка.
- * @return {string}
- */
- self.unescape = function (str) {
- return decodeURIComponent(str.replace(/\+/g, ' '));
- };
- /**
- * Парсит URI-параметры.
- *
- * @param {string} params Исходная строка.
- * @param {string} sep Разделитель параметров.
- * @param {string} eq Разделитель пар ключ-значение.
- * @return {object}
- */
- self.parse = function (str, sep, eq) {
- sep = sep || '&';
- eq = eq || '=';
- var pairs = str.split(sep);
- var pos;
- var keys;
- var value;
- var name;
- var j;
- var cur;
- var item;
- var isList;
- var ret = {};
- for (var i = 0; i < pairs.length; ++i) {
- pos = pairs[i].indexOf(eq);
- pos = pos == -1 ? pairs[i].length : pos
- keys = parseFieldName(pairs[i].slice(0, pos));
- value = self.unescape(pairs[i].slice(++pos));
- j = 0;
- cur = ret;
- for (;;) {
- item = keys[j];
- if (j) {
- isList = /^(|\d|[1-9]\d+)$/.test(item);
- if (!cur[name]) {
- cur[name] = isList ? [] : {};
- }
- cur = cur[name];
- if (cur.constructor == Array && !isList) {
- throw 'Array index error';
- }
- name = isList ? (item == '' ? cur.length : parseInt(item)) : self.unescape(item);
- }
- else {
- name = self.unescape(item);
- }
- if (++j == keys.length) {
- break;
- }
- }
- cur[name] = value;
- }
- return ret;
- };
- /**
- * Разбивает имя параметра на части:
- * foo[bar] -> ['foo', 'bar']
- *
- * @param {string} str Имя параметра.
- * @return {array}
- */
- function parseFieldName(str) {
- var slices = [];
- var p;
- var p1 = 0;
- var err = false;
- var ret = [];
- while (~(p = str.indexOf('[', p1))) {
- if (!slices.length) {
- slices.push(0, p);
- }
- err = p1 && p != p1;
- if (!err) {
- err = (p1 = str.indexOf(']', ++p)) == -1;
- }
- if (err) {
- break;
- }
- slices.push(p, p1++);
- }
- err = p1 && p1 != str.length;
- if (err) {
- throw 'Invalid field name: ' + str;
- }
- for (var i = 0; i < slices.length; i += 2) {
- ret.push(str.slice(slices[i], slices[i + 1]));
- }
- return ret.length ? ret : [str];
- }
- /**
- * Создает из объекта строку с параметрами.
- *
- * @param {string} obj Параметры.
- * @param {string} sep Разделитель параметров.
- * @param {string} eq Разделитель пар ключ-значение.
- * @return {string}
- */
- self.stringify = function (obj, sep, eq) {
- var pairs = [];
- var name;
- var value;
- eq = eq || '=';
- for (var i in obj) {
- if (obj.hasOwnProperty(i)) {
- name = encodeURIComponent(i);
- value = encodeURIComponent(obj[i]);
- // вложенные массивы
- pairs.push(name + eq + value);
- }
- }
- return pairs.join(sep || '&');
- };
- })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement