3

我正在尝试在 jQuery 中设置一个数组,然后我需要对其进行 for 循环。但似乎由于某种原因我不能使用关联数组?

var items = new Array();
items['foo'] = 123456;
items['bar'] = 789012;
items['baz'] = 345678;
items['bat'] = 901234;
alert(items.length);

这只是一个测试,但它返回 0?

4

4 回答 4

11

你不能associative array像你想要的那样在 JavaScript 中制作,而是可以使用Object

例如:

var items = {
  foo : 123456,
  bar : 789012,
  baz : 345678,
  bat : 901234
}

并计算你可以做的长度:

var getObjectSize = function(obj) {
    var len = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) len++;
    }
    return len;
};

采用:getObjectSize(items); // output: 4

有关更多信息,请参见此处

另一个是:

Object.keys(items).length;

但并非所有浏览器都支持。

于 2012-08-07T17:45:58.493 回答
2
var items = new Array();
items['foo'] = 123456;

问题出在第一行。您认为您正在向数组的索引处添加一项foo,但实际上您正在向items具有键foo和值的变量添加属性123456。如果您要键入items.foo它,它将返回您的123456.

这种方法的问题是向数组添加属性不会神奇地增加它的长度。

如果要使用非数字索引,则需要使用对象而不是数组:

var items = {
    foo: 123456,
    bar: 789012,
    baz: 345678,
    bat: 901234
};
于 2012-08-07T17:52:48.870 回答
2

另一种方法可能是设置两个不同的数组,您可以并行构建它们:

var items = [], items2 = [];
items.push('foo');
items2.push(123456);
// etc.
alert(items2.length);​

这种方法的效率取决于您将如何使用它。如果您只想遍历项目列表并对每个项目做一些事情,那么这种方法可能更有效。但是,如果您需要像关联数组 ( ) 一样使用items['foo']它,那么您最好构建一个对象。

于 2012-08-07T17:55:09.750 回答
1

.length 属性返回数组的最高数字索引。因此,在您的情况下,没有数字索引,它返回 0。尝试

items[98] = "something";

items.length 将是 98 ..!谨慎使用 .length 属性,如果您还想计算非数字索引,请遍历对象(数组也是对象)并计算其 ownProperties。

于 2012-08-07T17:53:40.297 回答