$ .Param () व्युत्क्रम फ़ंक्शन जावास्क्रिप्ट / jQuery में


122

निम्नलिखित फॉर्म दिए गए हैं:

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

मैं $.param( .. )फॉर्म को क्रमबद्ध करने के लिए निर्माण का उपयोग कर सकता हूं :

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

=> foo=bar&hello=hello+world

मैं जावास्क्रिप्ट के साथ उपरोक्त स्ट्रिंग को कैसे मिटा सकता हूं और एक हैश वापस पा सकता हूं?

उदाहरण के लिए,

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

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

संदर्भ: jQuery.param( obj )


2
अरे, मैं सिर्फ इस टिप्पणी को जोड़ रहा हूं ताकि आप उस अपडेट को देख सकें जो मैंने कोड के लिए किया था, यदि आप इसका उपयोग कर रहे हैं ... तो मैंने गलती से इसे लिखा था ताकि यह केवल पहले को बदल दे +। अब यह उन सभी को बदल देता है!
ब्लिक्स

प्लगइन्स कहा जाता है QueryString। मैंने एक बनाया है, लेकिन यह मापदंडों को स्वीकार नहीं करता है, यह केवल window.location.search से पढ़ता है। मैं दूसरों को याद करता हूं जो मापदंडों को स्वीकार करते हैं ...
ब्रूनोएलएम

1
निर्भरता के बिना refactored jquery BBQ deparam () विधि NPM मॉड्यूल के रूप में npmjs.com/package/deparam
alexey2baranov

alexey2baranov निर्भरता के रूप में एनपीएम के बिना deparamoring () के बारे में कैसे? :)
एंड्रयू

जवाबों:


62

आप का उपयोग करना चाहिए jQuery BBQ के deparam कार्य करते हैं। यह अच्छी तरह से परीक्षण और प्रलेखित है।


अच्छा प्लगइन! साझा करने के लिए धन्यवाद।
जोनाथन

29
यदि आप संपूर्ण बीबीक्यू प्लगइन प्राप्त नहीं करना चाहते हैं, तो डेपराम फ़ंक्शन को यहां स्टैंडअलोन प्लगइन के रूप में निकाला गया था: 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
वास्तव में जो मैंने स्वीकार किए गए उत्तर के साथ सोचा था "यह सरणियों के साथ काम नहीं करेगा"। आपका समाधान सही काम करता है।
रॉबर्ट कोरिटनिक

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 से अपेक्षित व्यवहार है। @ जैकीली का समाधान इस बात का ध्यान रखता है।
13:10 बजे कार 10m

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 द्वारा भेजे जा रहे पार्म्स को पार्स करने की आवश्यकता है। यह सही ढंग से नेस्टेड हैश लौटाता है। बहुत बहुत धन्यवाद, जैकी ली!
पास्कल लिंडेलौफ

अब तक का सबसे अच्छा समाधान - यह बहुत अच्छा व्यवहार करता है ! लेकिन जब मैं उपयोग करता 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 मुझे देगा)।
13

1
यह सही उत्तर है और कृपया अन्य सभी awers पर ध्यान न दें, वे ठीक से काम नहीं करते हैं
एंड्रयू

1
यह उत्तर केवल एक है जिसने मेरे विशेष उपयोग के मामले को संबोधित किया है (जहां मैंने jQuery के $ .param के लिए नेस्टेड कुंजी / मानों के साथ एक ऑब्जेक्ट पास किया है। यह ठीक से पुनर्प्राप्ति पर उन मानों को हाइड्रेट करता है)।
delinear

9

मैं डेविड डोरवर्ड के उत्तर का उपयोग कर रहा हूं, और महसूस किया कि यह रेल या पीएचडी या रूबी की तरह व्यवहार नहीं करता है कि वे पार्स को कैसे पार करते हैं:

1) एक चर केवल एक सरणी है अगर यह समाप्त होता है [], जैसे कि ?choice[]=1&choice[]=12, जब यह नहीं है?a=1&a=2

2) जब mulitple params समान नाम के साथ मौजूद होते हैं, तो बाद वाले पहले वाले को बदल देते हैं, जैसा कि PHP सर्वर (रूबी ऑन रूल्स पहले वाले को रखते हैं और बाद वाले को अनदेखा करते हैं), जैसे कि ?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;
};

जो काफी अच्छी तरह से परीक्षण किया है।


उरई युक्ति यह है कि? = A = 1 & a = 2 एक सरणी होनी चाहिए। रूबी ऑन रेल्स और पीएचपी वास्तविक विनिर्देशन का पालन नहीं करते हैं।
21

वह पंक्ति जहाँ आप सरणी के लिए hash[k.substr(0, k.length-2)] = [v];hash[k.substr(0, k.length-2)].push(v);
जोड़ते हैं

अच्छा होगा अगर इसे
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-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

जबकि जैकी ली का समाधान aएक सादे वस्तु के रूप में बाहरी कंटेनर का उत्पादन करेगा

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

getargs() यह निर्धारित करने के लिए किसी भी स्तर के लिए पहले दिए गए सूचकांक को देखता है कि क्या यह स्तर एक ऑब्जेक्ट (गैर-संख्यात्मक सूचकांक) या एक सरणी (न्यूमेरिक या खाली) होगा, इस प्रकार आउटपुट के रूप में लिस्टिंग बोव (6 नंबर) में दिखाया गया है।

यदि वर्तमान वस्तु एक सरणी है तो nullखाली पदों का प्रतिनिधित्व करने के लिए जहां भी आवश्यक हो सम्मिलित करें। Arrays हमेशा लगातार क्रमांकित और 0-आधारित हैं)।

ध्यान दें, कि उदाहरण में नहीं। 8 खाली सूचकांकों के लिए "ऑटोइन्क्रिमेंट" अभी भी काम करता है, भले ही हम अभी एक वस्तु के साथ काम कर रहे हैं और एक सरणी नहीं।

जहां तक ​​मैंने इसका परीक्षण किया है, मेरा स्वीकार किए गए उत्तर में उल्लिखित getargs()क्रिस रोजर के महान 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()सूचकांक []एक के रूप में व्याख्या की है undefinedएक autoincremented संख्यात्मक सूचकांक के बजाय।


इस शानदार समारोह के लिए धन्यवाद। हालाँकि मैंने देखा कि यदि आप सरणी में कुंजी के रूप में संख्या का उपयोग करते हैं, जैसे '? ([5] [] = x' तो कुंजी का उपयोग संख्या का उपयोग वस्तु बनाते समय किया जाता है और इस प्रकार यह मेरे मामले में 5 खाली तत्व बनाता है। यह संख्यात्मक कुंजी को स्ट्रिंग के रूप में व्यवहार करना चाहिए, और इस प्रकार मूल्य के रूप में "5" (उद्धरण के साथ) के रूप में कुंजी और एक्स के साथ ऑब्जेक्ट बनाएं। मैं उर होने के लिए मजबूर कर सकता हूं! '[एक "5"] [] = x' लेकिन यह बदसूरत है ...
एंड्रयू

@Andrew: यह मेरी ओर से एक जानबूझकर किया गया डिज़ाइन निर्णय था: जहाँ तक मुझे याद है, जैक का समाधान उस तरीके से अधिक व्यवहार करेगा जिस तरह से आप इसकी अपेक्षा करते हैं। मैंने o[k]=isNaN(idx[0])?{}:[];एक सरणी बनाने के इरादे से लाइन शुरू की , जब भी मैं किसी नई वस्तु के लिए दिए गए पहले अंक के रूप में एक संख्यात्मक सूचकांक का सामना करता हूं। अन्यथा मैं एक सामान्य वस्तु बनाऊंगा। यह आप पर निर्भर करता है कि अपनी आवश्यकताओं के अनुरूप कोड के उस हिस्से को बेहतर तरीके से संशोधित करें। अर्थात। कुछ इस तरह o[k]={}करना चाहिए।
18:10 पर कारों 10m

धन्यवाद। PS आपको निश्चित रूप से कंसोल को अपने कार्य के बीच में हटा देना चाहिए;)
एंड्रयू

@Andrew: धन्यवाद, अभी टिप्पणी की है। जब मैंने कोड पोस्ट किया, तो इसे अनदेखा करना चाहिए था।
7:10 बजे car10m

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
मुझे यह कार्य पसंद नहीं है। बिना मान वाले पैरामीटर को 'सही' का मान क्यों मिलना चाहिए? अशक्त क्यों नहीं? मुझे लगता है कि इस डिजाइन निर्णय से बहुत सूक्ष्म कीड़े हो सकते हैं। इसके अलावा, उस स्थिति को क्यों नहीं हैंडल किया जाए जहां 'अंतिम' मान का चयन करने के बजाय पैरामीटर में कई मान हो सकते हैं? डेविड द्वारा पोस्ट किया गया समाधान काफी बेहतर है।
SolutionYogi

4
यह trueइतना है कि कोई भी जांच कर सकता है if (params.redirect)या समान है। यदि आप trueऔर अन्य मूल्य के बीच अंतर करना चाहते हैं , तो आप उपयोग करेंगे if (params.redirect === true)। एक nullमूल्य किसी भी तरह से मदद नहीं करेगा जो मैं सोच सकता हूं। मैं डेविड की तरह नहीं था इसका कारण यह है कि मैं लचीलेपन पर निरंतरता को महत्व देता हूं। उसकी विधि के साथ मुझे यह जांचना होगा कि क्या मान एक स्ट्रिंग है या इसके मूल्य का उपयोग करने के लिए एक सरणी है। मेरी राय में, यह हमेशा एक स्ट्रिंग होना चाहिए ( trueमान 'true'जिसके लिए मुझे लगता है कि वह ठीक है) में परिवर्तित होता है, या हमेशा एक सरणी हो। मैंने स्ट्रिंग चुना।
ब्लिक्स

उस खाते के अनुसार, अगर यह params.delete था, तो यह सच हो जाएगा और मैं कुछ हानिकारक करूंगा। जैसा कि आप देख सकते हैं, उदाहरण के साथ आना आसान है। 'अशक्त' स्पष्ट रूप से निर्दिष्ट करता है कि कोई मूल्य मौजूद नहीं है और कॉल करने वाले के लिए निर्णय छोड़ दिया जाता है कि वह इसकी व्याख्या कैसे करना चाहता है। कई मूल्यों के बारे में, इसे इस तरह से देखें। खाने के बाद, आप यह सुनिश्चित कर रहे हैं कि या तो कॉलर डिबगिंग में समय बिताएगा कि उसे केवल एक मूल्य क्यों मिल रहा है या बाद में आने पर और कोड को संशोधित करना चाहिए। सरणी अपफ्रंट को वापस करके, कॉलर तुरंत पता चल जाएगा कि उन्हें कैसे संभालना है। सूचना को छोड़ना कभी भी अच्छा नहीं है, IMHO।
सोल्यूयोगी

2
यदि URL है /abc?deleteतो मुझे उम्मीद है कि इसके लिए एक प्रविष्टि होगी delete। मैं नहीं देखता कि कैसे अलग है? मैं यह भी नहीं देखता कि आप इस कारण अन्य कोड को कैसे पसंद कर सकते हैं, क्योंकि यह कोड उस मान को स्ट्रिंग में सेट कर देगा 'undefined'जो बेहतर नहीं है। और कई मूल्यों के लिए यह सादगी बनाम लचीलेपन का मामला है। मैं क्वेरी स्ट्रिंग्स में कई मानों का उपयोग शायद ही कभी देखता हूं, लेकिन यदि आप उन्हें चाहते हैं, तो हमेशा 1+ मान के साथ एक सरणी लौटाएं। रिटर्न प्रकार कभी न मिलाएं; फिर आपको डिबग करने के लिए समय बिताना होगा क्योंकि आमतौर पर एक स्ट्रिंग जो अचानक एक सरणी हो सकती है।
ब्लिक्स

धन्यवाद। मुझे नहीं लगता कि चांदी की गोली है। मैंने आपका कोड लिया और इसे थोड़ा संशोधित किया, बूलियन मूल्यों को हटा दिया, सरणी-मापदंडों के पार्सिंग को जोड़ा। ? फू [] = 1 & फू [] = 2 => फू: ["1", "2"]
seb

6

उसके लिए धन्यवाद http://james.padolsey.com/javascript/parsing-urls-with-the-dom/

बहुत आसान है: डी

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
यह कई विकल्पों के साथ चुनिंदा बॉक्स के साथ काम नहीं करता है, क्योंकि यह केवल अंतिम चयनित रखता है।
फर्नांडो फैब्रेटी

क्षमा करें, लेकिन मैं यह नहीं देख सकता कि आप टिप्पणी में किस बिंदु का उल्लेख कर रहे हैं। यहाँ संदर्भित फ़ंक्शन ?something=1&param2=value2को एक सरणी में जैसे params के साथ एक URI को अनसुना / पार्स करना है । "कई विकल्पों के साथ चुनिंदा बक्से के साथ काम न करें" से आपका क्या मतलब है?
क्रूर

4

यहां मेरा जावास्क्रिप्ट कार्यान्वयन है जो मैं एक सर्वर-साइड JScript ASP क्लासिक पेज ( डेमो ) में उपयोग करता हूं :

// 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


1

मैं इस समाधान के साथ आया था, जो कि .Net फ़ंक्शन की तरह व्यवहार करता है HttpUtility.ParseQueryString

परिणाम में, क्वेरी स्ट्रिंग पैरामीटर को मूल्यों की सूची के रूप में गुणों में संग्रहित किया जाता है, जिससे कि नेट में qsObj["param"]कॉलिंग के समान होगा GetValues("param")

मुझे उम्मीद है आप इसे पसंद करेंगे। 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

सीएसएस-ट्रिक्स ( निकोलस ऑर्टेंज़ियो से मूल स्रोत ) पर एक सुंदर एक-लाइनर है :)

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 / एज में समर्थित नहीं है।


दुर्भाग्य से IE द्वारा समर्थित नहीं है, हमेशा की तरह, यदि आपको इस ब्राउज़र का समर्थन करने की आवश्यकता है।
लॉरेन

0

यह कॉफ़ीस्क्रिप्ट में मेरा संस्करण है। इसके अलावा 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
बिना स्पष्टीकरण के कोड का स्वागत नहीं है। कृपया कृपया आगे बढ़ें और अपना कोड स्पष्ट करें?
एल। गुथर्ट

किसी सरणी या ऑब्जेक्ट का क्रमबद्ध प्रतिनिधित्व बनाता है (AJAX अनुरोधों के लिए URL क्वेरी स्ट्रिंग के रूप में उपयोग किया जा सकता है)
विशाल पटेल

कृपया अपने उत्तर में सीधे स्पष्टीकरण जोड़ें, इसे संपादित करके। हालांकि टिप्पणियों में नहीं।
एल। गुटहार्ट

-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()( लिंक ) का उपयोग कर सकते हैं । यह फ़ंक्शन कुंजी-मान जोड़ी की एक सरणी देता है। परिणाम उदाहरण:

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

1
यह वह नहीं है जो पूछा गया था। वह एक स्ट्रिंग को हैश में बदलना चाहता है। serializeArray एक फॉर्म लेता है और एक सरणी देता है।
डेनियल बैंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.