将URL哈希参数转换为对象的功能(键值对)

时间:2014-05-05 21:12:15

标签: javascript hash

考虑这个字符串:#page?param1=a&param2=b&param3=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' }

3 个答案:

答案 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"}

所以,如果除了上面的参数之外你还在字符串中有其他东西,那么在调用这个函数之前你需要先删除它们。

工作演示:

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