0

我创建了一个数组,其中包含来自 url 的查询字符串值

var vars = [], hash;
var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');

for (var i = 0; i < hashes.length; i++) {
     hash = hashes[i].split('=');
     vars[hash[0]] = hash[1];
}

如果我想迭代它,不会发生任何事情:

$.each(query_array, function(k, v) {
   console.log(v);
}); 

然后我写了

console.log(query_array.length);

但我的数组在 Chrome 控制台中看起来像:

[keyword: "mercedes", redirectTo: "test.aspx", remove: function]

长度返回 0。为什么?

我怎么能遍历这种数组?

4

4 回答 4

3

如果您制作, not anvars它会为您工作:objectarray

var vars = {}, hash;
var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');

for (var i = 0; i < hashes.length; i++) {
     hash = hashes[i].split('=');
     vars[hash[0]] = hash[1];
}

console.log(vars) //Object {keyword: "mercedes", redirectTo: "test.aspx", remove: function}

您不能通过索引访问数组的元素,索引不是数字。在您的情况下 - 索引不是数字。

于 2013-06-28T06:04:07.860 回答
2

var vars = []应更改var vars = {}为您的创建对象。[]表示数组。

然后,$.each将工作。

您还可以使用 location.search 而不是 location.href 获取查询字符串。请检查下面的更新代码

var vars = {}, hash;
var hashes = window.location.search.substring(1).split('&');

for (var i = 0; i < hashes.length; i++) {
     hash = hashes[i].split('=');
     vars[hash[0]] = hash[1];
}
于 2013-06-28T06:04:07.723 回答
1

vars不是数组。在 javascript 中,数组必须始终具有整数索引。在您的情况下,您使用字符串作为索引:

vars[hash[0]] = hash[1];

所以不要创建数组,只需创建一个对象:

var vars = {}, hash;

并且您将能够迭代此对象的属性:

$.each(vars, function(k, v) {
    console.log(k + ': ' + v);
});
于 2013-06-28T06:05:19.343 回答
1

好的,我将对此进行详细解释。

JavaScript 中的每个对象都可以像 Map(Dictionary) 一样工作。像这样的东西。

var a = new Object();
a["foo"] = 10;
a["bar"] = 20;

...

甚至Array( []) 也是一个对象。所以它会尊重同样的行为。像这样...

var arr = [];
arr["foo"] = 10;
arr["bar"] = 20;

但这并不意味着您正在使用应该使用的 Array。即使您向数组添加了属性,但您没有向数组添加任何元素,因此长度计数为 0。所以也许您应该将计数保留为单独的键/值对。

希望你明白。

于 2013-06-28T06:09:23.377 回答