20

有没有更好的方法将 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]; });
4

10 回答 10

34

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

于 2011-08-17T08:52:45.520 回答
21

另请注意,有一个 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);
}
于 2019-04-18T16:45:46.437 回答
14

如果您使用的是现代浏览器,则会产生与接受的答案相同的结果:

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;
  }, {})
}
于 2014-12-29T14:56:15.510 回答
12

可能是简单情况下最短的解决方案:

location.search
  .slice(1)
  .split('&')
  .map(p => p.split('='))
  .reduce((obj, [key, value]) => ({ ...obj, [key]: value }), {});
于 2017-11-22T21:55:33.067 回答
3

我的方法,简单干净

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

于 2016-10-15T16:16:07.440 回答
1

只是想用一点 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);
于 2016-04-26T20:19:19.130 回答
1

在 @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);
于 2017-11-10T05:18:39.017 回答
0

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

于 2017-04-01T07:48:35.327 回答
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);

前任 -

覆盖搜索@1st 行

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

你得到的输出是

Object {abc: "foo", def: "[asf]", xyz: "5", foo: "b=ar"}
于 2017-10-23T18:11:56.463 回答
0

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

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

易于使用只需调用getQueryStringValue(term)

于 2018-09-11T23:30:09.697 回答