使用jQuery的javascript关联数组长度

我正在使用javascript关联数组,如:

var testarray = []; testarray['one'] = '1'; testarray['two'] = '2'; testarray['three'] = '3'; 

我也在旁边使用jquery。 如何使用jquery或任何其他方法检查此关联数组的长度? 基本上我想检查这个数组是否为空。

谢谢。

您不应该使用数组来存储非数字索引,您应该使用一个简单的对象:

 function getObjectLength (o) { var length = 0; for (var i in o) { if (Object.prototype.hasOwnProperty.call(o, i)){ length++; } } return length; } 

编辑:由于您使用的是jQuery并且想要检查对象是否为“空”,因此1.4版本引入了$.isEmptyObject

 if ($.isEmptyObject(obj)) { //... } 

这为您提供了关联数组的长度:

 Object.keys(testarray).length 

没有直接的“长度”或“大小”调用,您必须测试对象中可用的键。

请注意, 所有 JavaScript对象都是关联数组(映射),因此使用通用对象而不是数组可能会更好地使用代码:

 var testarray = {}; // <= only change is here testarray['one'] = '1'; testarray['two'] = '2'; testarray['three'] = '3'; 

您可以使用for..in找出对象中的键是什么:

 var name; for (name in testarray) { // name will be 'one', then 'two', then 'three' (in no guaranteed order) } 

...您可以使用它来构建一个函数来测试对象是否为空。

 function isEmpty(obj) { var name; for (name in obj) { return false; } return true; } 

正如CMS在他的回答中标记的那样,它将遍历所有键,包括对象原型上的键。 如果您只想要对象上的键而不是其原型,请使用内置的hasOwnProperty函数:

 function isEmpty(obj) { var name; for (name in obj) { if (obj.hasOwnProperty(name)) { return false; } } return true; } 

我也有这个问题,我刚刚意识到了解决方案(并在我的浏览器中测试过):

 //given: ass_arr, an associative array //result: count now holds the "length" of ass_arr var count = 0; $.each(ass_arr, function(key, val) { count+=1; } ); alert(count); //number of iterable attributes in ass_arr 

如果这对您有用,请告诉我! 我正在将它写入我的代码中,如下所示:

 var devices = STATUS.devices, num_devices = 0; $.each(devices, function(id, device) { num_devices+=1; } ); //num_devices set to number of devices 

你可以像下面这样计算长度:

 var testarray = {}; // Use a generic object to store non-numeric indexes not an array testarray['one'] = '1'; testarray['two'] = '2'; testarray['three'] = '3'; var count = 0 for each(key in testarray) count = count + 1 alert(count); // count contains the number of items in the array 

您可以遍历属性来计算它们:

 var cnt = 0; for (i in testarray) cnt++; alert(cnt); 

请注意, for (... in ...)也会循环原型添加的项目,因此您可能只想计算之后添加的项目:

 var cnt = 0; for (i in testarray) if (testarray.hasOwnProperty(i)) cnt++; alert(cnt); 

如果您只想检查是否有任何属性,可以在第一个项后退出循环:

 var empty = true; for (i in testarray) if (testarray.hasOwnProperty(i)) { empty = false; break; } alert(empty); 

你那里没有真正的数组,所以我要避免像这样初始化它:

 var testNotArray = { }; testNotArray['one'] = 'something'; // ... 

现在这本质上是危险的,但第一步可能是:

 function objectSize(o) { var c = 0; for (var k in o) if (o.hasOwnProperty(k)) ++c; return c; } 

同样,这种方法有一百万种奇怪的方法可能会失败。