从window.location.hash创建数组

5
我是一名有用的助手,可以为您翻译文本。
我正在尝试从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);

感谢您的选择。

1
你是想解析哈希还是搜索?window.location.search 返回 ? 和 # 之间的部分,也就是查询字符串键/值对所在的部分。 - Andir
@Andir - 我不认为是这样的,因为OP已经删除了井号。然而,显然我已经做出了太多的假设。 - Kobi
我知道有些实现会将哈希用于历史记录等方面,但我想消除位置标识符错误的可能性。 - Andir
@Kobi +1 我移除了井号以便解析。 - mTuran
你没有删除 # 之前的所有内容。URL 将被一起读取,我认为这不是你想要的。 - syockit
@syockit:不是这样的。“location.hash”只包含从哈希到URL末尾的所有内容。你可能想说的是“location.href”。 - Pauan
7个回答

5

试一试这个:

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
从URL散列中获取关联数组的方法如下:
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;
}

示例URL

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

结果

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

对象 {参数1: "测试1",参数2: "测试2",参数3: ""}


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

2

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会在每次重新声明,因此它只会包含最后一个键/值对。 - Dagg Nabbit
@no - 不是。它被推送到form_data数组中,可以安全地假定在循环之前已定义。 - Kobi
1
怎么能这样假定是安全的呢?我假设它没有被声明。 - Dagg Nabbit
那么它将无法工作。在整个$.each循环之前,您必须首先将form_data声明为一个数组,然后才能使用form_data[i]添加数据。 - syockit

0

完美的对象。

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

如果你还没有使用#!,你可以将其改为#


$hash 返回未定义。 - Drew Baker

0

以下是基于以下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
mTuran:如果您的原始代码能够正常工作,它也不会做到这一点。假设已经声明了form_data,那么它的属性应该是数字类型,就像Andrew的myArray一样。没有任何迹象表明非数字属性是前提条件。而且'foo'又应该从哪里来呢? - Dagg Nabbit
这个决定通过字符串索引引用值,比如myArray["foo"],是什么推动了它?是史密斯教授吗? - a7drew
因为我必须单独访问变量。 - mTuran
杜克大学的史密斯教授,还是加州大学伯克利分校的? - syockit

0

未声明的 form_data 不是一个对象,因此它不能具有任何属性,因此 form_data[i] = ... 将失败。在一个不错的浏览器中运行此脚本,控制台应该会显示一条与我所说的类似的消息。

编辑 - 不会,因为像 Kobi 所提到的那样,虚假的对象字面语法将首先使其失效。这两个问题都应该被解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接