JavaScript / jQuery의 $ .param () 역함수


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 2010-08-28

1
종속 관계없이 NPM 모듈과 같은 리팩토링 JQuery와 바베큐 deparam () 메소드는 npmjs.com/package/deparam
alexey2baranov

alexey2baranov NPM없이 deparam ()을 종속성으로 리팩토링하는 것은 어떻습니까? :)
Andrew

답변:


62

당신은 사용해야합니다 jQuery를 BBQdeparam의 기능을. 잘 테스트되고 문서화되었습니다.


멋진 플러그인! 공유해 주셔서 감사합니다.
조나단

29
전체 BBQ 플러그인을 가져 오지 않으려면 deparam 함수가 여기에서 독립 실행 형 플러그인으로 추출되었습니다. github.com/chrissrogers/jquery-deparam
Felipe Castro

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
"이것은 배열에서 작동하지 않을 것입니다"라는 대답으로 내가 생각한 것입니다. 솔루션이 제대로 작동합니다.
Robert Koritnik

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
이것은 허용되는 대답이어야하며 외부 종속성이 없어야합니다.
Michael Robinson

간단하고 안정적이며 강력한 솔루션입니다. 존경합니다.
fmquaglia

5
그것이하는 일에 대해 확실히 좋은 해결책입니다. 그러나 전달되는 배열이나 객체는 처리하지 않습니다. URL field[][]=a&field[0][]=b&field[0][]=cObject { field[][]: "a", field[0][]: "c" }있어야 하는 위치로 처리됩니다 resultobject.field[0] = Array [ "a", "b", "c" ]. 이것은 PHP에서 예상되는 동작입니다. @JackyLi의 솔루션이이를 처리합니다.
cars10m

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;
}

예! 예! 예! 이것은 $ .ajax 호출에서 JQuery에 의해 전송되는 매개 변수를 구문 분석하는 데 필요한 정확한 것입니다. 이것은 올바르게 중첩 된 해시를 반환합니다. 감사합니다, Jacky Li!
Pascal Lindelauf 2011

지금까지 최고의 솔루션- 잘 작동합니다 ! 그러나 내가 사용하면 내가 기대했던 것이 아니라 JSON.stringify(geturlargs('fld[2][]=2&fld[][]=3&fld[3][]=4&fld[]=bb&fld[]=cc').fld)얻을 수 있습니다 (이것이 PHP가 나에게 줄 것입니다). {"2":["2"],"3":["4"],"":"cc"}[null,null,[2],[3,4],"bb","cc"]
cars10m

1
이것은 정답이며 다른 모든 답변을 무시하십시오. 제대로 작동하지 않습니다
Andrew

1
이 답변은 내 특정 사용 사례를 해결 한 유일한 답변입니다 (중첩 된 키 / 값이있는 객체를 jQuery의 $ .param에 전달한 경우 검색시 해당 값을 적절하게 수화 함).
delinear

9

David Dorward의 답변을 사용하고 있으며 매개 변수를 구문 분석하는 방법이 PHP 또는 Ruby on Rails처럼 작동하지 않는다는 것을 깨달았습니다.

1) 변수는 다음으로 끝나는 경우에만 배열입니다. [] 과 같은 ?choice[]=1&choice[]=12그 때가 아니라?a=1&a=2

2) 같은 이름을 가진 여러 개의 매개 변수가 존재하는 경우, PHP 서버에서와 같이 나중 매개 변수가 이전 매개 변수를 대체합니다 (Ruby on Rails는 첫 번째 매개 변수를 유지하고 이후 매개 변수는 무시 함). ?a=1&b=2&a=3

그래서 David의 버전을 수정하면 다음과 같습니다.

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는 실제 사양을 따르지 않습니다.
adiktofsugar 2013.02.26

배열에 추가하는 줄은 다음 hash[k.substr(0, k.length-2)] = [v];과 같아야합니다.hash[k.substr(0, k.length-2)].push(v);
Baptiste Pernet 2013 년

이 NPM을 통해 제공 될 수 있다면 좋겠지
에릭 반 Velzen을

7

나는 이것이 오래된 스레드라는 것을 알고 있지만 여전히 관련성이 있습니까?

Jacky Li의 좋은 솔루션에 영감을 받아 배열과 객체의 임의 조합을 입력으로 처리 할 수 ​​있다는 목표를 가지고 약간의 변형을 시도했습니다. 나는 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-argument 없이 호출 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

Jacky Li의 솔루션은 a일반 물체로 외부 컨테이너를 생성하는 반면

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

getargs() 이 레벨이 객체 (비 숫자 인덱스)인지 또는 배열 (숫자 또는 비어 있는지)인지 결정하기 위해 모든 레벨에 대해 첫 번째로 제공된 인덱스를 살펴보면 목록 bove (6 번)와 같은 출력이 생성됩니다.

현재 객체가 배열이면 null 빈 위치를 나타내는 데 필요한 곳에 s가 삽입됩니다. 배열은 항상 연속적으로 번호가 매겨지며 0부터 시작).

예에서 no. 8 빈 인덱스에 대한 "autoincrement"는 여전히 작동하지만 배열이 아닌 객체를 지금 다루고 있습니다.

내가 그것을 테스트하는 한, 나의 getargs()행동 은 받아 들여진 대답에 언급 된 Chriss Roger의 훌륭한 jQuery $.deparam() 플러그인 과 거의 동일하게 작동 합니다. 가장 큰 차이점은 즉 getargsjQuery를하지 않고 실행하고 있음을 수행 하는 동안 객체에 자동 증가를 $.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()인덱스 []int로서 해석됩니다 undefined대신 autoincremented 숫자 인덱스의.


이 훌륭한 기능에 감사드립니다. 그러나 '? a [5] [] = x'와 같이 배열의 키로 숫자를 사용하면 객체를 만들 때 키가 숫자로 사용되므로 제 경우에는 5 개의 빈 요소를 생성합니다. 숫자 키를 문자열로 취급하므로 "5"(따옴표 포함)를 키로, x를 값으로 사용하여 객체를 생성해야합니다. URL을 '? a [ "5"] [] = x'로 강제 설정할 수 있지만 이것은 추악합니다 ...
Andrew

@Andrew : 이것은 내 부분에서 의도적 인 디자인 결정이었습니다. 제가 기억하는 한 Jack의 솔루션은 여러분이 기대하는 방식으로 더 많이 작동 할 것입니다. o[k]=isNaN(idx[0])?{}:[];새 객체에 대해 주어진 첫 번째 인덱스로 숫자 인덱스를 만날 때마다 배열을 만들려는 의도로 줄 을 도입했습니다 . 그렇지 않으면 일반 객체를 만들 것입니다. 필요에 맞게 코드의 해당 부분을 수정하는 것은 사용자의 몫입니다. I. e. 뭔가 o[k]={}트릭을해야합니다.
cars10m

감사. 추신 : 확실히 당신의 함수 중간에 console.log를 제거해야합니다;)
Andrew

@Andrew : 감사합니다. 코드를 게시했을 때 간과했을 것입니다.
cars10m

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'값을 가져야하는 이유는 무엇입니까? null이 아닌 이유는 무엇입니까? 이 디자인 결정은 매우 미묘한 버그로 이어질 수 있다고 생각합니다. 또한 '마지막'값을 선택하는 대신 매개 변수가 여러 값을 가질 수있는 상황을 처리하지 않는 이유는 무엇입니까? David가 게시 한 솔루션이 훨씬 좋습니다.
SolutionYogi

4
그것은이다 true그 사람이 확인할 수 있도록 if (params.redirect)또는 유사한. 당신이 서로 다릅니다하려면 true다른 값을, 당신은 사용합니다 if (params.redirect === true). null값은 내가 생각할 수있는 어떤 식 으로든 도움이되지 것입니다. 제가 David처럼하지 않은 이유는 유연성보다 일관성을 중요시하기 때문입니다. 그의 방법을 사용하여 값을 사용하려면 값이 문자열인지 배열인지 확인해야합니다. 제 생각에는 항상 문자열 ( 내가 생각 true하기에 값이 변환 되는 값 'true')이거나 항상 배열이어야합니다. 나는 끈을 선택했다.
Blixt

그 계정으로 params.delete라면 true로 설정되고 해로운 일을 할 것입니다. 보시다시피 예제를 만드는 것은 쉽습니다. 'null'은 값이 존재하지 않음을 명확하게 지정하며, 어떻게 해석할지 결정은 호출자에게 맡겨집니다. 여러 값에 대해서는 이런 식으로보십시오. 먹음으로써 호출자가 왜 하나의 값만 얻는 지 디버깅하는 데 시간을 할애하거나 나중에 와서 코드를 수정하도록합니다. 어레이를 미리 반환함으로써 호출자는 즉시 어레이를 처리하는 방법을 알게됩니다. 정보를 버리는 것은 결코 좋지 않습니다, IMHO.
SolutionYogi

2
URL이 있으면에 /abc?delete대한 항목이있을 것으로 예상합니다 delete. 어떻게 다른지 모르겠어요? 이 코드가 'undefined'더 좋지 않은 문자열로 값을 설정하기 때문에 이런 이유로 다른 코드를 선호하는 방법도 알 수 없습니다. 그리고 여러 값의 경우 단순성 대 유연성의 경우입니다. 쿼리 문자열에서 여러 값을 사용하는 경우는 거의 없지만 원하는 경우 항상 1+ 값이있는 배열을 반환합니다. 반환 유형을 혼합하지 마십시오. 당신은 것입니다 일반적으로 무엇 문자열이 갑자기 배열이 될 수 있기 때문에 디버깅 시간을 보내고있다.
Blixt

감사. 은색 총알이 없다고 생각합니다. 코드를 가져 와서 약간 수정하고 부울 값을 제거하고 배열 매개 변수 구문 분석을 추가했습니다. ? foo [] = 1 & foo [] = 2 => foo : [ "1", "2"]
seb

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
마지막으로 선택한 상태로만 유지되기 때문에 여러 옵션이있는 선택 상자에서는 작동하지 않습니다.
Fernando Fabreti

죄송하지만 댓글에서 말씀하신 내용이 무엇인지 알 수 없습니다. 여기에서 참조하는 함수는 매개 변수가있는 URI를 ?something=1&param2=value2배열로 직렬화 해제 / 파싱하는 것 입니다. "여러 옵션이있는 선택 상자에서 작동하지 않음"이란 무엇을 의미합니까?
brutuscat 2012-08-17

4

다음은 서버 측 JScript ASP 클래식 페이지 ( 데모 ) 에서 사용하는 JavaScript 구현입니다 .

// 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 ( Nicholas Ortenzio의 원본 소스) 에는 아름다운 한 줄짜리가 있습니다.

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에서 지원하지 않습니다.
Lauren

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

배열 또는 개체의 직렬화 된 표현을 만듭니다 (AJAX 요청에 대한 URL 쿼리 문자열로 사용할 수 있음).

<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
설명이없는 코드는 환영하지 않습니다. 계속해서 코드를 설명해 주시겠습니까?
L. Guthardt

(AJAX 요청에 대한 URL 쿼리 문자열로 사용할 수 있습니다) 배열이나 객체의 직렬화 표현 작성
이씨 파텔

수정하여 답변에 직접 설명을 추가하십시오. 그래도 댓글에는 없습니다.
L. Guthardt

-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

jQuery 자체 의 기능 .serializeArray()( Link )을 사용할 수 있습니다 . 이 함수는 키-값 쌍의 배열을 반환합니다. 결과 예 :

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

1
이것은 요청 된 것이 아닙니다. 그는 문자열을 해시로 바꾸려고합니다. serializeArray는 형식을 취하고 배열을 반환합니다.
Daniel Bang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.