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.decode = function (str) {
- return decodeURIComponent(str.replace(/\+/g, ' '));
- };
- /**
- * Разбивает имя параметра на части.
- *
- * @param {string} str Имя параметра.
- * @return {array}
- */
- function parseParamName(str) {
- var a;
- var b = 0;
- var c = [];
- var ret = [];
- while (~(a = str.indexOf('[', b))) {
- if (!c.length) {
- c.push(0, a);
- }
- // символы между группами скобок: foo[bar]_[baz]
- if (b && a != b) {
- break;
- }
- b = str.indexOf(']', ++a);
- // не найдена закрывающая скобка ]
- if (b == -1) {
- break;
- }
- c.push(a, b++);
- }
- // символы после последней закрывающей скобки: foo[]_
- // if (b && b != str.length) {}
- for (var i = 0; i < c.length; i += 2) {
- ret.push(str.slice(c[i], c[i + 1]));
- }
- return ret.length ? ret : [str];
- }
- /**
- * Парсит URI-параметры.
- *
- * @param {string} str Исходная строка.
- * @param {string} sep Разделитель параметров.
- * @param {string} eq Разделитель пар ключ-значение.
- * @return {object}
- */
- self.parse = function (str, sep, eq) {
- if (str == '') {
- return null;
- }
- sep = sep || '&';
- eq = eq || '=';
- var ret = {};
- var pairs = str.split(sep);
- var pos;
- var keys;
- var name;
- var cur;
- var j;
- for (var i = 0; i < pairs.length; ++i) {
- pos = pairs[i].indexOf(eq);
- pos = pos == -1 ? pairs[i].length : pos
- keys = parseParamName(pairs[i].slice(0, pos));
- cur = ret;
- j = 0;
- while (j < keys.length) {
- if (j) {
- if (!cur[name]) {
- cur[name] = /^(|\d|[1-9]\d+)$/.test(keys[j]) ? [] : {};
- }
- cur = cur[name];
- if (isArray(cur)) {
- name = keys[j] == '' ? cur.length - (cur._t ? 1 : 0) : parseInt(keys[j]);
- cur._t = keys[j] == '';
- }
- else {
- name = self.decode(keys[j]);
- }
- name = isArray(cur) ? (keys[j] == '' ? cur.length : parseInt(keys[j])) : self.decode(keys[j]);
- }
- else {
- name = self.decode(keys[j]);
- }
- ++j;
- }
- cur[name] = self.decode(pairs[i].slice(++pos));
- }
- return ret;
- };
- /**
- * Вспомогательная функция для заполнения массива параметров.
- * @param {array} params
- * @param {string} name
- * @param {object} data
- */
- function updateParams(params, name, data) {
- if (isArray(data)) {
- var inOrder;
- for (var i = 0; i < data.length; ++i) {
- // пропускаем элементы с неустановленными значениями
- if (data[i] === undefined) {
- inOrder = false;
- continue;
- }
- // если элементы с установленными значениями идут по порядку, то индекс опускаем
- updateParams(params, name + '[' + (i == 0 || inOrder ? '' : i) + ']', data[i]);
- inOrder = true;
- }
- }
- else if (isObject(data)) {
- for (var i in data) {
- if (data.hasOwnProperty(i)) {
- updateParams(params, name + '[' + encodeURIComponent(i) + ']', data[i]);
- }
- }
- }
- else {
- params.push([name, encodeURIComponent(data)]);
- }
- }
- /**
- * Создает из объекта строку с параметрами.
- *
- * @param {object} obj Параметры.
- * @param {string} sep Разделитель параметров.
- * @param {string} eq Разделитель пар ключ-значение.
- * @return {string}
- */
- self.stringify = function (obj, sep, eq) {
- sep = sep || '&';
- eq = eq || '=';
- var params = [];
- var name;
- var cur;
- var value;
- for (var i in obj) {
- if (obj.hasOwnProperty(i)) {
- updateParams(params, encodeURIComponent(i), obj[i]);
- }
- }
- return params.map(function (a) { return a[0] + eq + a[1]; }).join(sep);
- };
- })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement