[removed].search query as JSON

后端 未结 10 827
北海茫月
北海茫月 2020-12-24 14:51

Is there a better way to convert a URL\'s location.search as an object? Maybe just more efficient or trimmed down? I\'m using jQuery, but pure JS can work too.



        
相关标签:
10条回答
  • 2020-12-24 15:52

    Note --No doubt above solution works, but it wont cover all the operators

    Guess you would want something like this-

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

    ex -

    Override search @1st line with

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

    Output you get is

    Object {abc: "foo", def: "[asf]", xyz: "5", foo: "b=ar"}
    
    0 讨论(0)
  • 2020-12-24 15:52

    In case someone is looking just to access the search query parameters, use this function:

    function getQueryStringValue (key)
    {
        return decodeURIComponent(window.location.search.replace(new RegExp("^(?:.*[&\\?]" + encodeURIComponent(key).replace(/[\.\+\*]/g, "\\$&") + "(?:\\=([^&]*))?)?.*$", "i"), "$1"))
    }
    

    Easy to use just call getQueryStringValue(term)

    0 讨论(0)
  • 2020-12-24 15:54

    Probably the shortest solution for simple cases:

    location.search
      .slice(1)
      .split('&')
      .map(p => p.split('='))
      .reduce((obj, [key, value]) => ({ ...obj, [key]: value }), {});
    
    0 讨论(0)
  • 2020-12-24 15:56

    Building on @rafaelbiten's ES6 work, I added support for params that have no value and query param arrays of the duplicate entry style.

    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 讨论(0)
提交回复
热议问题