无法返回在javascript中创建的数组的长度

时间:2013-06-28 05:54:02

标签: javascript jquery

我创建了一个包含来自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 个答案:

答案 0 :(得分:3)

如果您将vars设为object,而不是array,它将适用于您:

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}

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

答案 1 :(得分: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];
}

答案 2 :(得分:1)

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

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

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

var vars = {}, hash;

您将能够遍历此对象的属性:

$.each(vars, function(k, v) {
    console.log(k + ': ' + v);
});

答案 3 :(得分: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.所以也许你应该将计数保持为单独的键/值对。

希望你理解。