Зворотна функція $ .param () в JavaScript / jQuery


122

Дано таку форму:

<form>
    <input name="foo" value="bar">
    <input name="hello" value="hello world">
</form>

Я можу використовувати $.param( .. )конструкцію для серіалізації форми:

$.param( $('form input') )

=> foo=bar&hello=hello+world

Як я можу дезаріалізувати вищезазначений рядок за допомогою JavaScript і повернути хеш?

Наприклад,

$.magicFunction("foo=bar&hello=hello+world")

=> {'foo' : 'bar', 'hello' : 'hello world'}

Посилання: jQuery.param( obj ).


2
Гей, я просто додаю цей коментар, щоб ви могли побачити оновлення, яке я зробив до коду, на випадок, якщо ви його використовуєте ... Я випадково написав його, щоб він замінив лише перший +. Тепер він замінює їх усіх!
Blixt

Є плагіни, що називаються QueryString. Я зробив один, але він не приймає параметри, він читає лише з window.location.search. Я пам’ятаю інших, які приймають параметри ...
BrunoLM

1
refactored jquery BBQ deparam () метод як модуль NPM без залежностей npmjs.com/package/deparam
alexey2baranov

alexey2baranov як щодо refactoring deparam () без NPM як залежності? :)
Андрій

Відповіді:


62

Ви повинні використовувати JQuery BBQ «s deparam функцію. Це добре перевірено та задокументоване.


Гарний плагін! Дякую, що поділились.
Джонатан

29
Якщо ви не хочете отримувати весь плагін BBQ, функція deparam була вилучена як окремий плагін тут: github.com/chrissrogers/jquery-deparam
Феліпе Кастро

2
На жаль, сторінка github не бачила жодних оновлень протягом багатьох років, і коли я спробував це, вона не здається сумісною з останніми jQuery ... Схоже, що мені потрібно.
pilavdzice

31

Це трохи змінена версія функції, яку я писав деякий час тому, щоб зробити щось подібне.

var QueryStringToHash = function QueryStringToHash  (query) {
  var query_string = {};
  var vars = query.split("&");
  for (var i=0;i<vars.length;i++) {
    var pair = vars[i].split("=");
    pair[0] = decodeURIComponent(pair[0]);
    pair[1] = decodeURIComponent(pair[1]);
        // If first entry with this name
    if (typeof query_string[pair[0]] === "undefined") {
      query_string[pair[0]] = pair[1];
        // If second entry with this name
    } else if (typeof query_string[pair[0]] === "string") {
      var arr = [ query_string[pair[0]], pair[1] ];
      query_string[pair[0]] = arr;
        // If third or later entry with this name
    } else {
      query_string[pair[0]].push(pair[1]);
    }
  } 
  return query_string;
};

1
Саме те, що я вважав прийнятою відповіддю, "це не буде працювати з масивами". Ваше рішення працює добре.
Роберт Коритник

20

Як щодо цього короткого функціонального підходу?

function parseParams(str) {
    return str.split('&').reduce(function (params, param) {
        var paramSplit = param.split('=').map(function (value) {
            return decodeURIComponent(value.replace(/\+/g, ' '));
        });
        params[paramSplit[0]] = paramSplit[1];
        return params;
    }, {});
}

Приклад:

parseParams("this=is&just=an&example") // Object {this: "is", just: "an", example: undefined}

1
Це має бути прийнята відповідь, ніяких зовнішніх залежностей.
Майкл Робінсон

Просте, надійне та потужне рішення. Повага, сер.
fmquaglia

5
Для того, що він робить, це, безумовно, хороше рішення. Але це не піклується про масиви чи об’єкти, які передаються. URL field[][]=a&field[0][]=b&field[0][]=cобробляється як Object { field[][]: "a", field[0][]: "c" }слід, де він повинен бути resultobject.field[0] = Array [ "a", "b", "c" ]. Така поведінка, як очікується від PHP. @ Рішення JackyLi насправді переймається цим.
автомобілі10м

16

Моя відповідь:

function(query){
  var setValue = function(root, path, value){
    if(path.length > 1){
      var dir = path.shift();
      if( typeof root[dir] == 'undefined' ){
        root[dir] = path[0] == '' ? [] : {};
      }

      arguments.callee(root[dir], path, value);
    }else{
      if( root instanceof Array ){
        root.push(value);
      }else{
        root[path] = value;
      }
    }
  };
  var nvp = query.split('&');
  var data = {};
  for( var i = 0 ; i < nvp.length ; i++ ){
    var pair = nvp[i].split('=');
    var name = decodeURIComponent(pair[0]);
    var value = decodeURIComponent(pair[1]);

    var path = name.match(/(^[^\[]+)(\[.*\]$)?/);
    var first = path[1];
    if(path[2]){
      //case of 'array[level1]' || 'array[level1][level2]'
      path = path[2].match(/(?=\[(.*)\]$)/)[1].split('][')
    }else{
      //case of 'name'
      path = [];
    }
    path.unshift(first);

    setValue(data, path, value);
  }
  return data;
}

Так! Так! Так! Це саме те, що мені потрібно для розбору парам, які надсилаються JQuery у виклику $ .ajax. Це повертає правильно вкладені хеші. Велике спасибі, Джекі Лі!
Паскаль Лінделауф

Найкраще рішення поки що - Він поводиться досить добре! Але коли я використовую, JSON.stringify(geturlargs('fld[2][]=2&fld[][]=3&fld[3][]=4&fld[]=bb&fld[]=cc').fld)я отримую, {"2":["2"],"3":["4"],"":"cc"}а не [null,null,[2],[3,4],"bb","cc"]те, на що я б сподівався (саме це мені дасть PHP).
автомобілі10м

1
Це правильна відповідь, і будь ласка, ігноруйте всі інші дзвінки, вони працюють не правильно
Андрій

1
Ця відповідь є єдиною адресою мого конкретного випадку використання (де я передав об’єкт з вкладеними ключами / значеннями до $ .param jQuery, це належним чином зволожує ці значення при пошуку).
розмежування

9

Я використовую відповідь Девіда Дорворда і зрозумів, що він не поводиться як PHP чи Ruby on Rails, як вони розбирають парами:

1) змінна - це лише масив, якщо вона закінчується [], наприклад ?choice[]=1&choice[]=12, не, коли вона є?a=1&a=2

2) коли паралельні паралелі існують з тим самим іменем, пізніші замінюють більш ранні, як на серверах PHP (Ruby on Rails зберігає перший і ігнорує пізніші), наприклад ?a=1&b=2&a=3

Отже, змінюючи версію Девіда, я маю:

function QueryStringToHash(query) {

  if (query == '') return null;

  var hash = {};

  var vars = query.split("&");

  for (var i = 0; i < vars.length; i++) {
    var pair = vars[i].split("=");
    var k = decodeURIComponent(pair[0]);
    var v = decodeURIComponent(pair[1]);

    // If it is the first entry with this name
    if (typeof hash[k] === "undefined") {

      if (k.substr(k.length-2) != '[]')  // not end with []. cannot use negative index as IE doesn't understand it
        hash[k] = v;
      else
        hash[k.substr(0, k.length-2)] = [v];

    // If subsequent entry with this name and not array
    } else if (typeof hash[k] === "string") {
      hash[k] = v;  // replace it

    // If subsequent entry with this name and is array
    } else {
      hash[k.substr(0, k.length-2)].push(v);
    }
  } 
  return hash;
};

який випробовується досить ретельно.


Специфікація uri полягає в тому, що? A = 1 & a = 2 має бути масивом. Ruby on Rails та PHP не відповідають фактичним характеристикам.
адиктофсугар

Рядок, де ви додаєте до масиву, повинен бути hash[k.substr(0, k.length-2)] = [v];іhash[k.substr(0, k.length-2)].push(v);
Baptiste Pernet,

Було б добре, якби це стало доступним через npm
Ерік ван Вельцен

7

Я знаю, що це стара тема, але, можливо, є ще якась актуальність у ній?

Натхненний хорошим рішенням Джекі Лі, я спробував незначну варіацію свого власного завдання, щоб також міг дбати про довільні комбінації масивів та об'єктів як вхідних даних. Я подивився, як це зробив би PHP, і спробував зробити щось подібне. Ось мій код:

function getargs(str){
   var ret={};
   function build(urlnam,urlval,obj){ // extend the return object ...
    var i,k,o=obj, x, rx=/\[([^\]]*)\]/g, idx=[urlnam.replace(rx,'')];
    while (x=rx.exec(urlnam)) idx.push(x[1]); 
    while(true){
     k=idx.shift();
     if(k.trim()=='') {// key is empty: autoincremented index
       if (o.constructor.name=='Array') k=o.length; // for Array
       else if (o===obj ) {k=null}  // for first level property name
       else {k=-1;                                  // for Object
         for(i in o) if (+i>k) k=+i;
         k++;
       }
     }
     if(idx.length) { 
       // set up an array if the next key (idx[0]) appears to be
       // numeric or empty, otherwise set up an object:
       if (o[k]==null || typeof o[k]!='object') o[k]=isNaN(idx[0])?{}:[]; 
       o=o[k]; // move on to the next level
     }
     else { // OK, time to store the urlval in its chosen place ...
       // console.log('key',k,'val',urlval);                 
       o[k]=urlval===""?null:urlval; break; // ... and leave the while loop.
     } 
    }
    return obj;
   }
   // ncnvt: is a flag that governs the conversion of
   // numeric strings into numbers
   var ncnvt=true,i,k,p,v,argarr=[],
       ar=(str||window.location.search.substring(1)).split("&"),
       l=ar.length;
   for (i=0;i<l;i++) {if (ar[i]==="") continue;
     p=ar[i].split("=");k=decodeURIComponent(p[0]);
     v=p[1];v=(v!=null)?decodeURIComponent(v.replace(/\+/g,'%20')):'';
     if (ncnvt && v.trim()>"" && !isNaN(v)) v-=0;
     argarr.push([k,v]);  // array: key-value-pairs of all arguments
   }
   for (i=0,l=argarr.length;i<l;i++) build(argarr[i][0],argarr[i][1],ret);
   return ret;
}

Якщо функція викликається без strаргументу, вона вважатиметься window.location.search.slice(1)вхідною.

Деякі приклади:

['a=1&a=2',                               // 1
 'x[y][0][z][]=1',                        // 2
 'hello=[%22world%22]&world=hello',       // 3
 'a=1&a=2&&b&c=3&d=&=e&',                 // 4
 'fld[2][]=2&fld[][]=3&fld[3][]=4&fld[]=bb&fld[]=cc',  // 5
 $.param({a:[[1,2],[3,4],{aa:'one',bb:'two'},[5,6]]}), // 6
 'a[]=hi&a[]=2&a[3][]=7&a[3][]=99&a[]=13',// 7
 'a[x]=hi&a[]=2&a[3][]=7&a[3][]=99&a[]=13'// 8
].map(function(v){return JSON.stringify(getargs(v));}).join('\n')

призводить до

{"a":2}                                    // 1
{"x":{"y":[{"z":[1]}]}}                    // 2
{"hello":"[\"world\"]","world":"hello"}    // 3
{"a":2,"b":null,"c":3,"d":null,"null":"e"} // 4 = { a: 2, b: null, c: 3, d: null, null: "e" }
{"fld":[null,null,[2],[3,4],"bb","cc"]}    // 5 
{"a":[[1,2],[3,4],{"aa":"one","bb":"two"},[5,6]]}  // 6
{"a":["hi",2,null,[7,99],13]}              // 7
{"a":{"0":2,"3":[7,99],"4":13,"x":"hi"}}   // 8

Тоді як рішення Джекі Лі виготовляло б зовнішній контейнер aяк звичайний предмет

{a:{"0":["1","2"],"1":["3","4"],"2":["5","6"]}} // 6: JackyLi's output

getargs() дивиться на перший заданий індекс для будь-якого рівня, щоб визначити, чи буде цей рівень об'єктом (нечисловим індексом) або масивом (числовим або порожнім), таким чином, отримуючи результат, як показано в лістингу списку (№ 6).

Якщо поточним об'єктом є масив, то nullвставляємо s, куди потрібно, щоб представити порожні позиції. Масиви завжди є послідовно пронумерованими та на основі 0).

Зауважимо, що в прикладі немає. 8 "автоматичне збільшення" для порожніх індексів все ще працює, хоча ми маємо справу з об'єктом зараз, а не масивом.

Наскільки я перевірив це, моя getargs()поведінка майже однаково відповідає великому $.deparam() плагіну jQuery Кріса Роджера, згаданому у прийнятій відповіді. Основна відмінність полягає в тому, що він getargsпрацює без jQuery і в тому, що він робить автоматичне збільшення об'єктів, тоді як $.deparam()це не буде робити:

JSON.stringify($.deparam('a[x]=hi&a[]=2&a[3][]=7&a[3][]=99&a[]=13').a);

призводить до

{"3":["7","99"],"x":"hi","undefined":"13"}

В $.deparam()індексі []інтерпретується як undefinedзамість автоматично підвищеного числового індексу.


дякую за цю чудову функцію. Однак я помітив, що якщо ви використовуєте число в якості ключа в масиві, наприклад, як "? A [5] [] = x", тоді ключ використовується як число при створенні об'єкта, і таким чином він створює 5 порожніх елементів у моєму випадку. Він повинен розглядати числовий ключ як рядок, і таким чином створювати об'єкт з "5" (з лапками) як ключ, а x як значення. Я міг би змусити url бути "? A [" 5 "] [] = x ', але це некрасиво ...
Андрій

@Andrew: Це було обдумане дизайнерське рішення з мого боку: наскільки я пам’ятаю, рішення Джека буде вести себе більше так, як ви цього очікуєте. Я представив рядок o[k]=isNaN(idx[0])?{}:[];з наміром створити масив, коли я стикаюся з числовим індексом як перший, заданий для нового об'єкта. Інакше я зроблю родовий об’єкт. Ви повинні змінити цю частину коду, щоб вона краще відповідала вашим потребам. І. е. щось подібне o[k]={}повинно зробити трюк.
автомобілі10м

Дякую. PS Ви обов'язково повинні видалити console.log посеред своєї функції;)
Андрій

@Andrew: Дякую, просто прокоментував це. Повинен не помітити це, коли я розмістив код.
автомобілі10м

6

Ось як можна створити нову функцію jQuery:

jQuery.unparam = function (value) {
    var
    // Object that holds names => values.
    params = {},
    // Get query string pieces (separated by &)
    pieces = value.split('&'),
    // Temporary variables used in loop.
    pair, i, l;

    // Loop through query string pieces and assign params.
    for (i = 0, l = pieces.length; i < l; i++) {
        pair = pieces[i].split('=', 2);
        // Repeated parameters with the same name are overwritten. Parameters
        // with no value get set to boolean true.
        params[decodeURIComponent(pair[0])] = (pair.length == 2 ?
            decodeURIComponent(pair[1].replace(/\+/g, ' ')) : true);
    }

    return params;
};

4
Мені ця функція не подобається. Чому параметр без значення повинен отримувати значення "true"? Чому не нульовим? Я думаю, що таке дизайнерське рішення може призвести до дуже тонких помилок. Крім того, чому б не обробити ситуацію, коли параметр може мати кілька значень замість вибору значення "останнє"? Рішення, розміщене Девідом, набагато краще.
SolutionYogi

4
Це trueтак, що можна перевірити if (params.redirect)чи подібне. Якщо ви хочете відрізнятись від trueінших значень, ви б використали if (params.redirect === true). nullЗначення не допомогло б в будь-якому випадку , що я можу думати. Причиною того, що я цього не зробив, як Девід, є те, що я ціную послідовність щодо гнучкості. За його методу я повинен перевірити, чи є значення рядком або масивом, щоб використовувати його значення. На мою думку, це завжди повинен бути рядок ( trueзначення, конвертоване в 'true'яке я вважаю нормальним), або завжди бути масивом. Я вибрав рядок.
Blixt

За цим рахунком, якби він був params.delete, він буде встановлений на істину, і я зроблю щось шкідливе. Як бачите, придумати приклад легко. 'null' чітко вказує, що значення не існує, і рішення залишається абоненту, що він хоче інтерпретувати. Щодо кількох значень, дивіться на це так З'їдаючи, ви переконуєтесь, що будь-який абонент витратить час на налагодження, чому він отримує лише одне значення АБО пізніше прийде та змінить код. Повернувши масив наперед, абонент одразу дізнається, як з ними поводитися. Відмова від інформації ніколи не є доброю, ІМХО.
РішенняYogi

2
Якщо URL-адреса є, /abc?deleteя б очікував, що там буде запис delete. Я не бачу, як це по-іншому? Я навіть не бачу, як ви можете віддати перевагу іншому коду з цієї причини, тому що цей код встановить значення для рядка, 'undefined'який не є кращим. А щодо декількох значень - це справа простоти та гнучкості. Я рідко бачу використання декількох значень у рядках запитів, але якщо ви хочете їх, завжди повертайте масив зі значеннями 1+. Ніколи не змішуйте тип повернення; то вам буде потрібно витрачати час на налагодження , тому , що, як правило , рядок може раптово бути масивом.
Blixt

Дякую. Я не думаю, що є срібна куля. Я взяв ваш код і трохи його змінив, видалив булеві значення, додав розбір параметрів масиву. ? Foo [] = 1 & Foo [] = 2 => Foo: [ "1", "2"]
СЕБ

6

Завдяки йому http://james.padolsey.com/javascript/parsing-urls-with-the-dom/

Досить просто: D

function params_unserialize(p){
var ret = {},
    seg = p.replace(/^\?/,'').split('&'),
    len = seg.length, i = 0, s;
for (;i<len;i++) {
    if (!seg[i]) { continue; }
    s = seg[i].split('=');
    ret[s[0]] = s[1];
}
return ret;}

2
Це не працює з виділеними полями з кількома параметрами, оскільки вони залишаються лише останніми обраними.
Фернандо Фабреті

Вибачте, але я не можу побачити, про що ви посилаєтесь у коментарі. Функція, на яку посилається тут, полягає в тому, щоб несериалізувати / проаналізувати URI з парами, як ?something=1&param2=value2у масив. Що ви маєте на увазі під "не працювати з виділеними полями з кількома параметрами"?
brutuscat

4

Ось моя реалізація JavaScript, яку я використовую на сторінці сервера JScript ASP Classic ( демонстрація ) на стороні сервера :

// Transforms a query string in the form x[y][0][z][]=1 into {x:{y:[{z:[1]}]}}
function parseJQueryParams(p) {
    var params = {};
    var pairs = p.split('&');
    for (var i=0; i<pairs.length; i++) {
        var pair = pairs[i].split('=');
        var indices = [];
        var name = decodeURIComponent(pair[0]),
            value = decodeURIComponent(pair[1]);

        var name = name.replace(/\[([^\]]*)\]/g, 
            function(k, idx) { indices.push(idx); return ""; });

        indices.unshift(name);
        var o = params;

        for (var j=0; j<indices.length-1; j++) {
            var idx = indices[j];
            var nextIdx = indices[j+1];
            if (!o[idx]) {
                if ((nextIdx == "") || (/^[0-9]+$/.test(nextIdx)))
                    o[idx] = [];
                else
                    o[idx] = {};
            }
            o = o[idx];
        }

        idx = indices[indices.length-1];
        if (idx == "") {
            o.push(value);
        }
        else {
            o[idx] = value;
        }
    }
    return params;
}

Поки що найкраще, що я знайшов для вкладених масивів
ymakux

3

використовуй це :

// convert query string to json object
var queryString = "cat=3&sort=1&page=1";

queryString
    .split("&")
    .forEach((item) => {
        const prop = item.split("=");
        filter[prop[0]] = prop[1];
    });

console.log(queryString);

1

Я придумав таке рішення, яке поводиться як функція .Net HttpUtility.ParseQueryString.

У результаті параметри рядка запиту зберігаються у властивостях як списки значень, так що qsObj["param"]вони будуть такими ж, як і виклик GetValues("param")у .Net.

Сподіваюся що вам це подобається. JQuery не потрібен.

var parseQueryString = function (querystring) {
    var qsObj = new Object();
    if (querystring) {
        var parts = querystring.replace(/\?/, "").split("&");
        var up = function (k, v) {
            var a = qsObj[k];
            if (typeof a == "undefined") {
                qsObj[k] = [v];
            }
            else if (a instanceof Array) {
                a.push(v);
            }
        };
        for (var i in parts) {
            var part = parts[i];
            var kv = part.split('=');
            if (kv.length == 1) {
                var v = decodeURIComponent(kv[0] || "");
                up(null, v);
            }
            else if (kv.length > 1) {
                var k = decodeURIComponent(kv[0] || "");
                var v = decodeURIComponent(kv[1] || "");
                up(k, v);
            }
        }
    }
    return qsObj;
};

Ось як його використовувати:

var qsObj = parseQueryString("a=1&a=2&&b&c=3&d=&=e&");

Для попереднього перегляду результату в консолі введіть:

JSON.stringify(qsObj)

Вихід:

"{"a":["1","2"],"null":["","b",""],"c":["3"],"d":[""],"":["e"]}"

1

У CSS-Tricks є прекрасна однолінійка (оригінальне джерело від Ніколаса Ортенціо ):

function getQueryParameters(str) {
    return (str || document.location.search).replace(/(^\?)/,'').split("&").map(function(n){return n = n.split("="),this[n[0]] = n[1],this}.bind({}))[0];
}

Дійсно розумна частина полягає в тому, як вона використовує thisоб'єкт анонімної функції , додаючи пару ключів / значень для кожного запиту в рядку. Це означає, що є можливість покращитись. Я змінив його трохи нижче, із такими змінами:

  1. Додано обробку порожніх рядків та введення рядків.

  2. Обробляються URI-кодовані рядки ( %40-> @тощо).

  3. Видалено значення за замовчуванням, document.location.searchколи вхід був порожнім.

  4. Змінили назву, зробили її більш читаною, додали коментарі.

function deparam(str) {
    // Uses an empty 'this' to build up the results internally
    function splitQuery(query) {
        query = query.split('=').map(decodeURIComponent);
        this[query[0]] = query[1];
        return this;
    }

    // Catch bad input
    if (!str || !(typeof str === 'string' || str instanceof String))
        return {};

    // Split the string, run splitQuery on each piece, and return 'this'
    var queries = str.replace(/(^\?)/,'').split('&');
    return queries.map(splitQuery.bind({}))[0];
}

1

Це справді старе питання, але в міру того, як я вже прийду - на цю посаду можуть прийти інші люди, і я хочу трохи оновити цю тему. Сьогодні не потрібно приймати власні рішення - є інтерфейс URLSearchParams .

var paramsString = "q=URLUtils.searchParams&topic=api";
var searchParams = new URLSearchParams(paramsString);

//Iterate the search parameters.
for (let p of searchParams) {
  console.log(p);
}

Єдине відоме мені обмеження - ця функція не підтримується в IE / Edge.


На жаль, не підтримується IE, як зазвичай, якщо вам потрібна підтримка цього браузера.
Лорен

0

Це моя версія в Coffeescript. Також працює як URL-адреса http://localhost:4567/index.html?hello=[%22world%22]&world=hello#/home

getQueryString: (url)->
    return null if typeof url isnt 'string' or url.indexOf("http") is -1

    split = url.split "?"

    return null if split.length < 2 
    path = split[1]

    hash_pos = path.indexOf "#"
    path = path[0...hash_pos] if hash_pos isnt -1

    data = path.split "&"
    ret = {}
    for d in data
      [name, val] = d.split "=" 
      name = decodeURIComponent name
      val = decodeURIComponent val
      try 
        ret[name] = JSON.parse val
      catch error
        ret[name] = val
    return ret

0

Ось простий та компактний, якщо ви хочете швидко отримати параметри з GET-запиту:

function httpGet() {
    var a={},b,i,q=location.search.replace(/^\?/,"").split(/\&/);
    for(i in q) if(q[i]) {b=q[i].split("=");if(b[0]) a[b[0]]=
    decodeURIComponent(b[1]).replace(/\+/g," ");} return a;
}

Це перетворює

something?aa=1&bb=2&cc=3

в такий предмет

{aa:1,bb:2,cc:3}

0

Створює серіалізоване представлення масиву або об'єкта (може використовуватися як рядок запиту URL для запитів AJAX).

<button id='param'>GET</button> 
<div id="show"></div>
<script>
  $('#param').click(function () {
    var personObj = new Object();
    personObj.firstname = "vishal"
    personObj.lastname = "pambhar";
    document.getElementById('show').innerHTML=$.param(`personObj`));
  });
</script>
output:firstname=vishal&lastname=pambhar

1
Код без пояснень не вітається. Можна, будь ласка, і надалі поясніть свій код?
Л. Гутхардт

Створює серійне представлення масиву чи об’єкта (може використовуватися як рядок запиту URL для запитів AJAX)
Vishal Patel,

Будь ласка, додайте пояснення безпосередньо у свою відповідь, відредагувавши її. Не в коментарях, хоча.
Л. Гутхардт

-1

відповіді можуть використовувати трохи елегантності jQuery :

(function($) {
var re = /([^&=]+)=?([^&]*)/g;
var decodeRE = /\+/g; // Regex for replacing addition symbol with a space
var decode = function (str) {return decodeURIComponent( str.replace(decodeRE, " ") );};
$.parseParams = function(query) {
    var params = {}, e;
    while ( e = re.exec(query) ) {
        var k = decode( e[1] ), v = decode( e[2] );
        if (k.substring(k.length - 2) === '[]') {
            k = k.substring(0, k.length - 2);
            (params[k] || (params[k] = [])).push(v);
        }
        else params[k] = v;
    }
    return params;
};
})(jQuery);

виделка на https://gist.github.com/956897


-1

Ви можете використовувати функцію .serializeArray()( Посилання ) jQuery. Ця функція повертає масив пари ключ-значення. Приклад результату:

[
  { name: "id", value: "1" },
  { name: "version", value: "100" }
]

1
Це не те, про що питали. Він хоче перетворити рядок у хеш. serializeArray приймає форму і повертає масив.
Даніель Банг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.