如何将URL参数转换为JavaScript对象?

问题描述 投票:191回答:27

我有这样的字符串:

abc=foo&def=%5Basf%5D&xyz=5

如何将其转换为这样的JavaScript对象?

{
  abc: 'foo',
  def: '[asf]',
  xyz: 5
}
javascript jquery url url-parameters url-parsing
27个回答
310
投票

编辑

此编辑改进并根据评论解释了答案。

var search = location.search.substring(1);
JSON.parse('{"' + decodeURI(search).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g,'":"') + '"}')

示例

以五个步骤解析abc=foo&def=%5Basf%5D&xyz=5

  • decodeURI:abc = foo&def = [asf]&xyz = 5
  • 转义引号:相同,因为没有引号
  • 替换为:: abc=foo","def=[asf]","xyz=5
  • 替换=:abc":"foo","def":"[asf]","xyz":"5
  • 带有小括号和引号的包围:{"abc":"foo","def":"[asf]","xyz":"5"}

这是合法的JSON。

一个改进的解决方案允许在搜索字符串中包含更多字符。它使用reviver函数进行URI解码:

var search = location.search.substring(1);
JSON.parse('{"' + search.replace(/&/g, '","').replace(/=/g,'":"') + '"}', function(key, value) { return key===""?value:decodeURIComponent(value) })

示例

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

给予

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

原始答案

单线:

JSON.parse('{"' + decodeURI("abc=foo&def=%5Basf%5D&xyz=5".replace(/&/g, "\",\"").replace(/=/g,"\":\"")) + '"}')

6
投票

我遇到了同样的问题,在这里尝试了解决方案,但是它们都不起作用,因为我在URL参数中有数组,如下所示:


6
投票

2019单线方法


5
投票

使用ES6,URL API和URLSearchParams API。


5
投票

ES6一个衬板(如果看到长线,我们可以这样称呼)


3
投票

[URLSearchParams JavaScript Web API的使用非常简单,


2
投票

我不知道任何本机解决方案。如果您偶然使用该框架,则Dojo具有内置的反序列化方法。


2
投票

[有一个名为YouAreI.js的轻量级库,它已经过测试,非常简单。


2
投票

对于Node JS,您可以使用Node JS API querystring


1
投票

这似乎是最好的解决方案,因为它考虑了多个相同名称的参数。


1
投票

这里是我用的一个:


74
投票

2019 ES6 / 7/8及以后的方法

从ES6开始,Javascript提供了几种结构来创建针对此问题的高性能解决方案。

这包括使用URLSearchParamsiterators

let params = new URLSearchParams('abc=foo&def=%5Basf%5D&xyz=5');
params.get("abc"); // "foo"

如果您的用例需要您将其实际转换为对象,则可以实现以下功能:

function paramsToObject(entries) {
  let result = {}
  for(let entry of entries) { // each 'entry' is a [key, value] tupple
    const [key, value] = entry;
    result[key] = value;
  }
  return result;
}

基本演示

const urlParams = new URLSearchParams('abc=foo&def=%5Basf%5D&xyz=5');
const entries = urlParams.entries(); //returns an iterator of decoded [key,value] tuples
const params = paramsToObject(entries); //{abc:"foo",def:"[asf]",xyz:"5"}

使用Object.fromEntries和传播

我们可以使用Object.fromEntries(当前处于阶段4),将paramsToObject替换为Object.fromEntries(entries)

要迭代的值对是列表名称-值对,其中键是名称,值是值。

由于URLParams返回一个iterable对象,所以使用spread operator而不是调用.entries也会按照其规范生成条目:

const urlParams = new URLSearchParams('abc=foo&def=%5Basf%5D&xyz=5');
const params = Object.fromEntries(urlParams); // {abc: "foo", def: "[asf]", xyz: "5"}

注意:根据URLSearchParams spec],所有值都是自动字符串


1
投票

这是我的又快又脏的版本,基本上是将用'&'分隔的URL参数拆分为数组元素,然后遍历该数组,将由'='分隔的键/值对添加到对象中。我正在使用encodeURIComponent()将编码的字符转换为它们的普通字符串等效项(因此%20变为空格,%26变为'&'等):


1
投票
//under ES6 
const getUrlParamAsObject = (url = window.location.href) => {
    let searchParams = url.split('?')[1];
    const result = {};
    //in case the queryString is empty
    if (searchParams!==undefined) {
        const paramParts = searchParams.split('&');
        for(let part of paramParts) {
            let paramValuePair = part.split('=');
            //exclude the case when the param has no value
            if(paramValuePair.length===2) {
                result[paramValuePair[0]] = decodeURIComponent(paramValuePair[1]);
            }
        }

    }
    return result;
}

1
投票

使用phpjs


1
投票

Mike Causer's answer的基础上,我制作了此函数,该函数考虑了具有相同键(foo=bar&foo=baz)的多个参数以及逗号分隔的参数(foo=bar,baz,bin)。它还可以让您搜索某个查询键。


1
投票

如果使用URI.js,则可以使用:


0
投票

首先需要定义什么是获取变量:


0
投票

我还需要在URL(+)的查询部分中处理decodeURIComponent doesn't,因此我将沃尔夫冈的代码改编为:


0
投票

我以这种方式做:


26
投票

&上分割以获取名称/值对,然后在=上分割每对。这是一个例子:


19
投票

ES6一个衬纸。干净简单。


14
投票

这是简单的版本,显然您将需要添加一些错误检查:


12
投票

一种简洁的解决方案:


10
投票

我发现$.String.deparam最完整的预制解决方案(可以嵌套对象等)。签出documentation


8
投票

到目前为止,我发现的拟议解决方案并未涵盖更复杂的场景。


7
投票

基于URLSearchParams(https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams)最新标准的另一种解决方案

© www.soinside.com 2019 - 2024. All rights reserved.