2011-06-30 17 views
9

क्या URL के स्थान को परिवर्तित करने का कोई बेहतर तरीका है। किसी ऑब्जेक्ट के रूप में खोज करें? शायद बस अधिक कुशल या छंटनी? मैं jQuery का उपयोग कर रहा हूं, लेकिन शुद्ध जेएस भी काम कर सकता है।window.location.search क्वेरी JSON

var query = window.location.search.substring(1), queryPairs = query.split('&'), queryJSON = {}; 
$.each(queryPairs, function() { queryJSON[this.split('=')[0]] = this.split('=')[1]; }); 

उत्तर

21

यहां एक शुद्ध जेएस फ़ंक्शन है। वर्तमान यूआरएल का खोज भाग पार्स करता है और ऑब्जेक्ट देता है। (यह पठनीयता, मन के लिए एक सा वर्बोज़ है।)

function searchToObject() { 
    var pairs = window.location.search.substring(1).split("&"), 
    obj = {}, 
    pair, 
    i; 

    for (i in pairs) { 
    if (pairs[i] === "") continue; 

    pair = pairs[i].split("="); 
    obj[ decodeURIComponent(pair[0]) ] = decodeURIComponent(pair[1]); 
    } 

    return obj; 
} 

एक संबंधित नोट पर, आप "एक JSON" में लेकिन "एक वस्तु" में एकल पैरामीटर स्टोर करने के लिए कोशिश नहीं कर रहे। ;)

+0

धन्यवाद, मैं मेरे सवाल का ठीक किया। – thugsb

9

आप आधुनिक ब्राउज़र उपयोग कर रहे हैं यह स्वीकार किए जाते हैं जवाब के रूप में एक ही परिणाम का उत्पादन:

function searchToObject(search) { 
    return search.substring(1).split("&").reduce(function(result, value) { 
    var parts = value.split('='); 
    if (parts[0]) result[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]); 
    return result; 
    }, {}) 
} 
1

बस इस समाधान ESNext और एक कम करने के एक बिट का उपयोग कर साझा करना चाहते थे।

यह @ कार्लो द्वारा सुझाए गए बहुत कुछ करता है लेकिन यदि आप ES6 और reducers के साथ सहज हैं तो यह थोड़ा क्लीनर है।

const urlSearchData = searchString => { 
    if (!searchString) return false; 

    return searchString 
     .substring(1) 
     .split('&') 
     .reduce((result, next) => { 
      let pair = next.split('='); 
      result[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]); 

      return result; 
     }, {}); 
}; 

const searchData = urlSearchData(window.location.search); 
1

मेरे दृष्टिकोण, सरल और साफ

var params = "?q=Hello World&c=Awesome"; 
 

 
params = "{\"" + 
 
     params 
 
     .replace(/\?/gi, "") 
 
     .replace(/\&/gi, "\",\"") 
 
     .replace(/\=/gi, "\":\"") + 
 
     "\"}"; 
 
    
 
params = JSON.parse(params); 
 

 
alert(decodeURIComponent(params.q)); 
 
alert(decodeURIComponent(params.c));

0

JSON पार्स के बाद stringify सरणी डेटा के साथ एक json को परिवर्तित करने का काम करता है।

?key1=val1&key2[]=val2.1&key2[]=val2.2&key2[]=val2.3&

{ 
    'key1' : 'val1', 
    'key2' : [ 'val2.1', 'val2.2', 'val2.3' ] 
} 

function QueryParamsToJSON() {    
 
    var list = location.search.slice(1).split('&'), 
 
     result = {}; 
 

 
    list.forEach(function(keyval) { 
 
     keyval = keyval.split('='); 
 
     var key = keyval[0]; 
 
     if (/\[[0-9]*\]/.test(key) === true) { 
 
      var pkey = key.split(/\[[0-9]*\]/)[0]; 
 
      if (typeof result[pkey] === 'undefined') { 
 
       result[pkey] = []; 
 
      } 
 
      result[pkey].push(decodeURIComponent(keyval[1] || '')); 
 
     } else { 
 
      result[key] = decodeURIComponent(keyval[1] || ''); 
 
     } 
 
    }); 
 

 
    return JSON.parse(JSON.stringify(result)); 
 
} 
 

 
var query_string = QueryParamsToJSON();

0

नोट समाधान ऊपर -कोई संदेह से काम करता है, लेकिन यह अभ्यस्त सभी ऑपरेटरों

कवर लगता है कि आप कुछ इस तरह चाहेगा -

var search = location.search; 
var trimmedSearch = search.substring(1); 

var searchObj = trimmedSearch?JSON.parse(
    '{"' + trimmedSearch.replace(/&/g, '","').replace(/=/g,'":"') + '"}', 
    function(key, value) { 
     return key===""?value:decodeURIComponent(value) 
    } 
) 
: 
{} 

console.log(searchObj); 

पूर्व -

अवहेलना खोज @ 1 लाइन के साथ

search = "abc=foo&def=%5Basf%5D&xyz=5&foo=b%3Dar"; 

आउटपुट आपको मिल @ rafaelbiten के ES6 काम पर

Object {abc: "foo", def: "[asf]", xyz: "5", foo: "b=ar"} 
0

बिल्डिंग है, मैं पैरामीटर है कि के लिए समर्थन जोड़ा डुप्लिकेट एंट्री शैली के कोई मूल्य और क्वेरी पैरा एरे नहीं।

JSFiddle: https://jsfiddle.net/w922xefs/

const queryStringToJSObject = searchString => { 
    if (!searchString) return null; 

    return searchString 
    .replace(/^\?/, '') // Only trim off a single leading interrobang. 
    .split('&') 
    .reduce((result, next) => { 
     if (next === "") { 
     return result; 
     } 
     let pair = next.split('='); 
     let key = decodeURIComponent(pair[0]); 
     let value = typeof pair[1] !== "undefined" && decodeURIComponent(pair[1]) || undefined; 
     if (result.hasOwnProperty(key)) { // Check to see if this property has been met before. 
     if (Array.isArray(result[key])) { // Is it already an array? 
      result[key].push(value); 
     } 
     else { // Make it an array. 
      result[key] = [result[key], value]; 
     } 
     } 
     else { // First time seen, just add it. 
     result[key] = value; 
     } 

     return result; 
    }, {} 
); 
}; 

// Simple read of query string 
const searchData = queryStringToJSObject(window.location.search); 
0

शायद साधारण मामलों के लिए सबसे छोटा समाधान:

location.search 
    .slice(1) 
    .split('&') 
    .map(p => p.split('=')) 
    .reduce((obj, [key, value]) => ({ ...obj, [key]: value }), {});