我有这样的字符串:
abc=foo&def=%5Basf%5D&xyz=5
如何将其转换为这样的JavaScript对象?
{
abc: 'foo',
def: '[asf]',
xyz: 5
}
此编辑改进并根据评论解释了答案。
var search = location.search.substring(1);
JSON.parse('{"' + decodeURI(search).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g,'":"') + '"}')
示例
以五个步骤解析abc=foo&def=%5Basf%5D&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,"\":\"")) + '"}')
我遇到了同样的问题,在这里尝试了解决方案,但是它们都不起作用,因为我在URL参数中有数组,如下所示:
使用ES6,URL API和URLSearchParams API。
ES6一个衬板(如果看到长线,我们可以这样称呼)
[URLSearchParams
JavaScript Web API的使用非常简单,
我不知道任何本机解决方案。如果您偶然使用该框架,则Dojo具有内置的反序列化方法。
[有一个名为YouAreI.js的轻量级库,它已经过测试,非常简单。
对于Node JS,您可以使用Node JS API querystring
:
这似乎是最好的解决方案,因为它考虑了多个相同名称的参数。
这里是我用的一个:
从ES6开始,Javascript提供了几种结构来创建针对此问题的高性能解决方案。
这包括使用URLSearchParams和iterators
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(当前处于阶段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],所有值都是自动字符串
这是我的又快又脏的版本,基本上是将用'&'分隔的URL参数拆分为数组元素,然后遍历该数组,将由'='分隔的键/值对添加到对象中。我正在使用encodeURIComponent()将编码的字符转换为它们的普通字符串等效项(因此%20变为空格,%26变为'&'等):
//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;
}
使用phpjs
在Mike Causer's answer的基础上,我制作了此函数,该函数考虑了具有相同键(foo=bar&foo=baz
)的多个参数以及逗号分隔的参数(foo=bar,baz,bin
)。它还可以让您搜索某个查询键。
如果使用URI.js,则可以使用:
首先需要定义什么是获取变量:
我还需要在URL(+
)的查询部分中处理decodeURIComponent doesn't,因此我将沃尔夫冈的代码改编为:
我以这种方式做:
在&
上分割以获取名称/值对,然后在=
上分割每对。这是一个例子:
ES6一个衬纸。干净简单。
这是简单的版本,显然您将需要添加一些错误检查:
一种简洁的解决方案:
我发现$.String.deparam最完整的预制解决方案(可以嵌套对象等)。签出documentation。
到目前为止,我发现的拟议解决方案并未涵盖更复杂的场景。
基于URLSearchParams(https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams)最新标准的另一种解决方案