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]);
});