我试图从?...&foo=bar&...
中获得{foo:"bar"}
的方法,但是搜索了一下只找到了jQuery.params
这个反向操作的函数。请问有什么建议(使用内置的JavaScript函数、jQuery、Underscore.js都可以),或者我需要自己实现它(不算太麻烦,只是不想重复造轮子)?
我试图从?...&foo=bar&...
中获得{foo:"bar"}
的方法,但是搜索了一下只找到了jQuery.params
这个反向操作的函数。请问有什么建议(使用内置的JavaScript函数、jQuery、Underscore.js都可以),或者我需要自己实现它(不算太麻烦,只是不想重复造轮子)?
实际上,@talsibony的上述答案并没有考虑查询字符串数组(例如test=1&test=2&test=3&check=wow&such=doge
)。这是我的实现:
function queryStringToJSON(qs) {
qs = qs || location.search.slice(1);
var pairs = qs.split('&');
var result = {};
pairs.forEach(function(p) {
var pair = p.split('=');
var key = pair[0];
var value = decodeURIComponent(pair[1] || '');
if( result[key] ) {
if( Object.prototype.toString.call( result[key] ) === '[object Array]' ) {
result[key].push( value );
} else {
result[key] = [ result[key], value ];
}
} else {
result[key] = value;
}
});
return JSON.parse(JSON.stringify(result));
};
我在这里发布我的函数,以防其他人查找并希望直接获得它,不需要 jQuery 原生 JS。因为我也在寻找同样的东西,最终在查看其他答案后编写了这个函数:
function queryStringToJSON(queryString) {
if(queryString.indexOf('?') > -1){
queryString = queryString.split('?')[1];
}
var pairs = queryString.split('&');
var result = {};
pairs.forEach(function(pair) {
pair = pair.split('=');
result[pair[0]] = decodeURIComponent(pair[1] || '');
});
return result;
}
console.log(queryStringToJSON(window.location.href));
console.log(queryStringToJSON('test=1&check=wow'));//Object {test: "1", check: "wow"}
jQuery BBQ
和其中的jQuery.deparam
。它被描述为基本上是jQuery.param的相反。
http://benalman.com/code/projects/jquery-bbq/examples/deparam/
第一个例子正是你所需要的。
function queryStringToObject(queryString) {
const pairs = queryString.substring(1).split('&');
// → ["foo=bar", "baz=buzz"]
var array = pairs.map((el) => {
const parts = el.split('=');
return parts;
});
// → [["foo", "bar"], ["baz", "buzz"]]
return Object.fromEntries(array);
// → { "foo": "bar", "baz": "buzz" }
}
console.log(queryStringToObject('?foo=bar&baz=buzz'));
URLSearchParams 接口 可以与浏览器 URL 搜索参数进行交互。 对于URLSearchParams 浏览器的支持相当不错。
针对您的情况,可以这样使用:
console.log(
Object.fromEntries(new URLSearchParams('foo=bar&baz=buzz'))
);
对于简单和扁平的查询字符串,可以使用以下方式解决问题:
const queryStringToObject = (queryString) => {
let obj = {}
if(queryString) {
queryString.slice(1).split('&').map((item) => {
const [ k, v ] = item.split('=')
v ? obj[k] = v : null
})
}
return obj
}
> queryStringToObject('?foo=bar&baz=buzz')
{ foo: 'bar', baz: 'buzz' }
data=thisisatestdata
。 - Amiritionslice
的调用,或者考虑扩展该方法以支持两种字符串类型。 - lfender6445URLSearchParams()
构造函数会创建并返回一个新的 URLSearchParams 对象。
var url = new URL('https://example.com?foo=1&bar=2');
var params = new URLSearchParams(url.search);
https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams/URLSearchParams
我知道这个帖子有点老了 - 但是这就是对我有效的方法 - 希望它也能帮助到其他人..
var _searchModel = yourquerystring.split("&");
for (var x = 0; x < _searchModel.length; x++) {
//break each set into key and value pair
var _kv = _searchModel[x].split("=");
//console.log(_kv);
var _fieldID = _kv[0];
var _fieldVal = _kv[1];
}