location.hash を解析して object にして返す

正規表現を使うのは大げさな気がする。
location.hash を location.search に書き換えて URL.searchParams で取得するほうが簡単だろうか?

[, 変数名, 大括弧, 変数値]に分割しながら解析する

function parseParms (str = '') {
  let
    reg = /(?:^#)?(\D\w*)(\[\])?=(.*?)(?:\&|\;|$)/g,
    pieces = new Map;

  while (piece = reg.exec (str)) {
    let [, key, isAry, val] = piece;
    key = decodeURIComponent (key);
    val = decodeURIComponent (val);

    if (isAry)
      val = [val];

    if (pieces.has (key))
      pieces.set (key, [].concat (pieces.get (key), val));
    else
      pieces.set (key, val);
  }

  return Object.fromEntries (pieces);
}