以 JSON 格式的 window.location.search 查询

Posted

技术标签:

【中文标题】以 JSON 格式的 window.location.search 查询【英文标题】:window.location.search query as JSON 【发布时间】:2011-09-26 06:06:29 【问题描述】:

有没有更好的方法将 URL 的 location.search 转换为对象?也许只是更有效或更精简?我用的是jQuery,但是纯JS也可以。

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

【问题讨论】:

【参考方案1】:

另请注意,有一个 api 用于查询/操作搜索参数: https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams

var params = new URLSearchParams(window.location.search)
for (let p of params) 
  console.log(p);

【讨论】:

老兄,这就是我正在寻找的解决方案。浏览器支持似乎很好,除了 IE。谢谢!【参考方案2】:

如果有人只想访问搜索查询参数,请使用此功能:

function getQueryStringValue (key)

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

简单易用,只需拨打getQueryStringValue(term)

【讨论】:

【参考方案3】:

可能是简单案例的最短解决方案:

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

【讨论】:

【参考方案4】:

在@rafaelbiten 的 ES6 工作的基础上,我添加了对没有值的参数的支持,并查询了重复条目样式的参数数组。

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

【讨论】:

【参考方案5】:

注意 --上述解决方案无疑是有效的,但它不会涵盖所有运营商

猜你会想要这样的东西-

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

前-

覆盖搜索@第一行

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

你得到的输出是

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

【讨论】:

【参考方案6】:

stringify 之后的 JSON Parse 完成了将数组数据转换为 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();

【讨论】:

【参考方案7】:

我的方法,简单干净

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

【讨论】:

【参考方案8】:

只是想用一点 ESNext 和 reducer 分享这个解决方案。

它与@Carlo 建议的几乎相同,但如果您对 ES6 和减速器感到满意,它会更简洁。

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

【讨论】:

【参考方案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;
  , )

【讨论】:

【参考方案10】:

这是一个纯 JS 函数。解析当前 URL 的搜索部分并返回一个对象。 (请注意,这对于可读性来说有点冗长。)

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”中,而是存储在“对象”中。 ;)

【讨论】:

以上是关于以 JSON 格式的 window.location.search 查询的主要内容,如果未能解决你的问题,请参考以下文章

将目标添加到 window.location [重复]

JS之BOM的几个对象

window.location.href=window.location.href 和 window.location.reload() 的区别

js获取当前页面信息

Arison [JS]window.location获取url各项参数详解

如何以json的格式发送到前端