考虑这个字符串:#page?param1=a¶m2=b¶m3=c
我一直在使用的混合应用程序使用window.location.hash
将应用程序路由到正确的页面。通常,这些URL包含散列后的参数。当然,这不是标准,但它是一个很好的解决方案,适用于我们的应用程序。
我需要创建一个函数,它将获取散列中的所有参数并将它们返回到对象中,例如:{param: value}
。
我尝试过涉及window.location.search
的其他问题解决方案,但遗憾的是,当参数在哈希值之后时,只返回一个空字符串。
我的尝试看起来像这样:
return JSON.parse('{"' + decodeURI(window.location.hash).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g,'":"') + '"}');
该解决方案取自另一个使用window.location.search
的问题,但使用window.location.hash
效果不正常,第一个参数(问号后面)显示为未定义。
如何创建一个可以在对象中返回哈希参数的函数?
上面字符串的期望结果是:
{ param1: 'a', param2: 'b', param3: 'c' }
答案 0 :(得分:12)
您可以使用此功能:
function parseParms(str) {
var pieces = str.split("&"), data = {}, i, parts;
// process each query pair
for (i = 0; i < pieces.length; i++) {
parts = pieces[i].split("=");
if (parts.length < 2) {
parts.push("");
}
data[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]);
}
return data;
}
这取自我编写的larger set of functionality on github .parseParms()
方法,用于解析URL到其所有部分。
输入是以下形式的字符串:
"aaa=1&bbb=99&name=Bob"
它会返回一个这样的对象:
{aaa: 1, bbb: 99, name: "Bob"}
所以,如果除了上面的参数之外你还在字符串中有其他东西,那么在调用这个函数之前你需要先删除它们。
工作演示:
function parseParms(str) {
var pieces = str.split("&"), data = {}, i, parts;
// process each query pair
for (i = 0; i < pieces.length; i++) {
parts = pieces[i].split("=");
if (parts.length < 2) {
parts.push("");
}
data[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]);
}
return data;
}
console.log(parseParms("aaa=1&bbb=99&name=Bob"));
&#13;
答案 1 :(得分:0)
function parseParms(str)
{
var pieces = str.split( "&" ),
data = {},
i, parts, key;
// Process each query pair
for ( i = 0; i < pieces.length; i++ ) {
parts = pieces[i].split( "=" );
// No value, only key
if ( parts.length < 2 ) {
parts.push( "" );
}
key = decodeURIComponent( parts[ 0 ] );
value = decodeURIComponent( parts[ 1 ] );
// Key is an array
if ( key.indexOf( "[]" ) !== -1 ) {
key = key.substring( 0, key.indexOf( "[]" ) );
// Check already there
if ( "undefined" === typeof data[ key ] ) {
data[ key ] = [];
}
data[ key ].push( value );
} else {
data[ key ] = value;
}
}
return data;
}
可以在此处找到工作示例:https://jsbin.com/xitemecuvi/edit?js,console
希望有所帮助。
答案 2 :(得分:0)
数组上的foreEach
方法使它变得更短:
const result = {};
hash.split('&').forEach(item => {
result[item.split('=')[0]] = decodeURIComponent(item.split('=')[1]);
});