【问题标题】:Creating Array From Window.location.hash从 Window.location.hash 创建数组
【发布时间】:2010-07-13 04:06:41
【问题描述】:

我正在尝试从 window.location.hash 变量创建数组,但我失败了。

我的代码是:

        $.each(window.location.hash.replace("#", "").split("&"), function (i, value) {
            value = value.split("=");

            var my_item = {value[0] : value[1]};
            form_data[i] = my_item; 
        });
        console.log(form_data);

谢谢。

【问题讨论】:

  • 您是在尝试解析哈希还是搜索? window.location.search 返回 ? 之后的部分在 # 之前,它是具有查询字符串键/值的部分。
  • @Andir - 我不认为是这种情况,因为 OP 删除了井号。话又说回来,显然我已经假设太多了。
  • 我知道有些实现将哈希用于历史记录之类的东西,但我想消除位置标识符错误的可能性。
  • @Kobi +1 我删除了哈希符号以准备解析。
  • 您没有删除# 之前的所有内容。该网址将被阅读,我认为这不是您想要的。

标签: javascript jquery arrays


【解决方案1】:

试试这个:

var hash = window.location.hash.slice(1);
var array = hash.split("&");

var values, form_data = {};

for (var i = 0; i < array.length; i += 1) {
    values = array[i].split("=");
    form_data[values[0]] = values[1];
}

console.log(form_data);

...当然我怀疑您可能想要搜索属性,而不是哈希,但我不知道您的具体用例。

【讨论】:

    【解决方案2】:
    your code is correct only error is
    
     $.each(window.location.hash.replace("#", "").split("&"), function (i, value) {
                value = value.split("=");
                var _formItem={};
                var my_item={};
                my_item[value[0]]= value[1]; 
                form_data[i] = my_item; 
            });
    

    【讨论】:

      【解决方案3】:

      JavaScript 不支持以下表示法:

      var my_item = {value[0] : value[1]};
      

      试试这个:

      var my_item = {};
      my_item[value[0]] = value[1];
      

      这将创建一个数组,其中每个元素都有一个键和一个值,例如:

      [{name: jason}, {age: 23}, {location: pacific}] //array of single keys
      

      在您的情况下,使用哈希可能会产生更多场景,因此您可以调用 form_data['age'],而不必查看数组:

      form_data初始化为一个对象:

      form_data = {};
      

      直接给它添加键:

      form_data[value[0]] = value[1];
      

      所以结果是:

      {name: jason, age: 23, location: pacific} //associative array with properties
      

      【讨论】:

      • 那也行不通; my_item 每次都会重新声明,所以它只会包含最后一个键/值对。
      • @no - 不。它被推送到form_data 数组,假设在循环之前定义它是安全的。
      • 如何安全假设?我以为它没有被声明。
      • 那就不行了。您必须先将form_data 声明为数组(在整个$.each 循环之前),然后才能使用form_data[i] 添加数据。
      【解决方案4】:

      从 url hash 中获取关联数组:

      function readUrlHashParams() {
          var result = {};
          var hashParam = window.location.hash.substring(1);
          var params = hashParam.split("&");
      
          $.each(params, function (index, set) {
              var paramSet = set.split("=");
              if (typeof (paramSet[1]) !== "undefined") {
                  result[paramSet[0]] = decodeURIComponent(paramSet[1]);
              } else {
                  result[paramSet[0]] = "";
              }
          });
          return result;
      }
      

      示例网址

      http://localhost/Index.html#Param1=test1&Param2=Test2&Param3=

      结果

      var test = readUrlHashParams();
      console.log(test);
      

      对象{Param1:“test1”,Param2:“Test2”,Param3:“”}

      【讨论】:

        【解决方案5】:

        未声明的form_data 不是对象,所以它不能有任何属性,所以form_data[i] = ... 会失败。在一个不错的浏览器中运行这个脚本,控制台应该会显示一条消息,就像我刚才所说的那样。

        edit - 不,它不会因为 Kobi 提到的虚假对象文字语法会首先出错。这两个问题都应该得到解决。

        【讨论】:

          【解决方案6】:

          以下是基于以下 URL 的示例:

          http://www.someUrl.com/Index.htm#foo=bob&moo=alice

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <title>hash me long time</title>
          </head>
          <body>
          
              <p>Hello World!</p>
          
              <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js"></script>
              <script type="text/javascript">
          
                  $(function () {
          
                      var hash = window.location.hash.replace('#', '').split('&');
                      var myArray = new Array();
                      for (var x = 0; x < hash.length; x++) {
                          var itemArray = hash[x].split('=');
                          var item = new Object();
                          item.key = itemArray[0];
                          item.value = itemArray[1];
                          myArray.push(item);
                      }
          
                      for (var x = 0; x < myArray.length; x++)
                          console.log(myArray[x].key + ' is ' + myArray[x].value);
          
                  });
          
              </script>
          </body>
          </html>
          

          【讨论】:

          • 感谢代码,但我必须访问这样的变量:myArray["foo"] 在这种情况下我不能。
          • mTuran:如果您的原始代码有效,也不会那样做。 form_data,假设它已被声明,将具有数字属性,就像 Andrew 的 myArray。没有迹象表明非数字属性是先决条件。无论如何,“foo”应该来自哪里?
          • 是什么促使我们决定通过字符串索引来引用值,例如在 myArray["foo"] 中,是史密斯教授吗?
          • 因为我必须单独访问变量
          • 杜克大学或UCB的史密斯教授?
          【解决方案7】:

          完美的对象。

          location.hash = location.hash ? location.hash : "#!";
          $.each((location.hash ? location.hash.split("#!") : [""])[1].split("&"), (function () {
           y = this.split("=");
           $hash[y[0]] = y[1];
          }));
          

          如果您还没有使用 #!你可以把它改成#

          【讨论】:

          • $hash 返回为未定义。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-10-29
          • 2013-03-16
          • 1970-01-01
          • 2021-07-08
          • 2010-09-14
          • 2017-08-10
          相关资源
          最近更新 更多