Javascript 函数将URL哈希参数转换为对象(键值对)
考虑这个字符串:Javascript 函数将URL哈希参数转换为对象(键值对),javascript,hash,Javascript,Hash,考虑这个字符串:#page?param1=a¶m2=b¶m3=c 我一直在开发的一个混合应用程序使用window.location.hash将应用程序路由到正确的页面。通常,这些URL在散列之后包含参数。当然,这不是标准的,但它是一个很好的解决方案,非常适合我们的应用程序 我需要创建一个函数,该函数将获取散列中的所有参数并在对象中返回它们,例如:{param:value} 我尝试过其他问题的解决方案,包括window.location.search,但遗憾的是,当参数在散列之后时
#page?param1=a¶m2=b¶m3=c
我一直在开发的一个混合应用程序使用window.location.hash
将应用程序路由到正确的页面。通常,这些URL在散列之后包含参数。当然,这不是标准的,但它是一个很好的解决方案,非常适合我们的应用程序
我需要创建一个函数,该函数将获取散列中的所有参数并在对象中返回它们,例如:{param:value}
我尝试过其他问题的解决方案,包括window.location.search
,但遗憾的是,当参数在散列之后时,它只返回一个空字符串
我的尝试如下所示:
返回JSON.parse(“{”+decodeURI(window.location.hash).replace(/“/g,\\”).replace(/&/g,“,”).replace(/=/g,“:”)+“}”)代码>
解决方案取自另一个使用window.location.search
但使用window.location.hash
的问题,第一个参数(问号后)显示为未定义
如何创建在对象中返回哈希参数的函数
上述字符串的预期结果如下:
{ param1: 'a', param2: 'b', param3: 'c' }
您可以使用此功能:
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;
}
它将返回这样一个对象:
{aaa: 1, bbb: 99, name: "Bob"}
因此,如果字符串中除了上述参数之外还有其他内容,那么在调用此函数之前需要先删除这些内容
工作演示:
函数parsems(str){
变量片段=str.split(&),数据={},i,部分;
//处理每个查询对
对于(i=0;i函数解析参数(str)
{
变量片段=str.split(&),
数据={},
i、 零件、钥匙;
//处理每个查询对
对于(i=0;i
可在此处找到工作示例:
希望这能有所帮助。数组上的foreach
方法使其更短:
const result = {};
hash.split('&').forEach(item => {
result[item.split('=')[0]] = decodeURIComponent(item.split('=')[1]);
});
太好了,谢谢!是的,我认为最好的方法就是在“?”之前拆分并删除所有内容。这个解决方案无法处理URL中的数组。请看我下面的例子。@t1gor-所以你否决了被接受的答案,它完全符合OP的要求,但不符合问题中没有的其他要求?真正地欢迎你推广自己的答案,并试图说服全世界相信这是一个更好的答案,但你通常不会否决符合问题要求的好答案。否决票通常只针对错误答案或表现出不良做法的答案。@jfriend00并不是真的想冒犯你,对不起。将在我被允许时恢复投票。@t1gor-我添加了一个工作演示,所以您现在应该可以恢复它。
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;
}
const result = {};
hash.split('&').forEach(item => {
result[item.split('=')[0]] = decodeURIComponent(item.split('=')[1]);
});