使用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; }
同样,这种方法有一百万种奇怪的方法可能会失败。