如果我在Javascript中有一个偶尔填充的数组,我该如何确定数组中非空元素的数量?
例如:
var zipCodes = [];
zipCodes[10006] = 'New York, NY';
zipCodes[90210] = 'Los Angeles, CA';
zipCodes.length在这里返回90,211我真的不想循环通过90,209个未知来找出我有两个有效元素。使用for-in循环意味着处理可能冒出原型链的任何事情,并试图弄清楚它是否是 this 数组的一部分。
有没有办法,鉴于上面定义的数组,我可以提取“2”作为已定义元素的数量?
答案 0 :(得分:12)
你需要一个具有键值对的对象(有点像关联数组/哈希表)而不是数组:
var zipCodes = {};
zipCodes[10006] = 'New York, NY';
zipCodes[90210] = 'Los Angeles, CA';
for(var zipCode in zipCodes) {
if(zipCodes.hasOwnProperty(zipCode)) {//makes sure prototypes aren't taken into account
}
}
编辑: 或者您可以将对象存储在数组中,如下所示:
var zipCodes = [];
zipCodes.push({10006:'New York, NY'});
zipCodes.push({90210: 'Los Angeles, CA'});
// zipCodes.length = 2
答案 1 :(得分:0)
您还可以(取决于各种各样的当前未知数)填充第二个数组,该数组包含第一个数组中填充条目的索引(索引?)。
所以你可以有一个方法缩放整个数组一次,填充第二个数组:
var indexesNext = 0;
var indexes = new Array();
for(i = 0 ; i < zipCodes.length ; i++)
if(zipCodes[i] != null) indexes[indexesNext++] = i;
或者您可以在zipCodes数组上使用添加和删除访问器方法来更新索引数组,如果您希望它经常更改。
或者您可以在数组上使用Javascript sort()方法,并迭代它直到您点击一个空单元格。您可以使用它来优化以前的技术(YMMV对这种内置方法的效率,但FFX 3.1和Chrome中的新Javascript引擎肯定会做得很好,我敢肯定。)