在Javascript / jQuery中获取对象的长度

3

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

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

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

4个回答

11
你不能像想象中的那样在 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); // 输出:4

更多信息请参见此处

另一个示例:

Object.keys(items).length;

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


1
JavaScript对象也是关联数组。我非常确定,我一直在使用这种灵活性。 - Diego
是的,请查看这个线程:https://dev59.com/QXVD5IYBdhLWcg3wWaVh - Andrew Mao
从技术上讲,JavaScript关联数组是表现得像关联数组的对象。但正如我之前所说的,如果它走起来像鸭子,叫起来像鸭子,那就称它为鸭子。 - Blazemonger
@Diego:在那些没有完全混淆“数组”和“字典”(我在看你,PHP!)的语言中,“数组”是由数字索引的连续元素序列,“字典”是键值映射。JS它们之间唯一的相似之处是“数组”索引是对象属性,而对象是一个“字典”。任何不是数字的东西都不是数组元素;它是一个对象属性。 - cHao

2
var items = new Array();
items['foo'] = 123456;

问题在于第一行。你认为你正在将一个项目添加到索引为foo的数组中,但实际上你正在将一个带有键foo和值123456的属性添加到items变量中。如果你输入items.foo,它会返回你的123456
这种方法的问题在于向数组添加属性并不会神奇地增加它的长度。
如果你想要非数字索引,你需要使用对象而不是数组:
var items = {
    foo: 123456,
    bar: 789012,
    baz: 345678,
    bat: 901234
};

2

另一种方法可能是设置两个不同的数组,你可以同时构建这两个数组:

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

这种方法的效率取决于你如何使用它。如果你只需要循环遍历项目列表并对每个项目执行某些操作,那么这种方法可能更有效。但是,如果你需要像使用关联数组一样使用它(items['foo']),那么最好建立一个对象。


items = items2 = [] 这行代码将 itemsitems2 指向同一个数组,导致长度加倍,因为它同时包含了键和值。 - cHao
糟糕,我把JavaScript和PHP搞混了,在这个过程中创造了全新的东西。已经修复。 - Blazemonger

1

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

items[98] = "something";

items.length 将会是 98..!使用 .length 属性时要小心,如果你还想计算非数字索引,请循环遍历对象(数组也是一个对象)并计算它的 ownProperties。


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