【问题标题】:How do you determine the number of defined elements in an array?如何确定数组中已定义元素的数量?
【发布时间】:2020-12-15 17:17:37
【问题描述】:

如果我在 Javascript 中有一个偶尔填充的数组,我如何确定数组中非空元素的数量?

例如:

var zipCodes = [];
zipCodes[10006] = 'New York, NY';
zipCodes[90210] = 'Los Angeles, CA';

zipCodes.length 在这里返回 90,211,我真的不想循环 90,209 个空来找出我有两个有效元素。使用 for-in 循环意味着处理任何可能在原型链中冒泡的东西,并试图弄清楚它是否是 this 数组的一部分。

有没有什么办法,给定上面定义的数组,我可以提取“2”作为定义元素的数量?

【问题讨论】:

    标签: javascript optimization


    【解决方案1】:

    你需要一个带有键值对的对象(有点像关联数组/哈希表)而不是数组:

    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 表示第一种方法,-1 第二种方法意义不大。我不会为 hasOwnProperty 业务而烦恼,如果您有代码在摆弄基本对象原型,那么就立即摆脱它。
    • @AnthonyWJones,您并不总是可以完全控制代码。尤其是当您使用 MooTools 或 Prototype.js 等 3rd 方库时,所以我只是养成了这个检查的习惯。另外,OP特别说原型链会有问题。
    • @Anthony:我同意 Vatos;如果您无法控制所有存在的脚本,总是检查hasOwnProperty();永远不要假设其他人都会遵守你的规则!
    • @Vatos:Anthony 对您的第二个示例有一点看法 - 没有简单的方法可以检索邮政编码!你应该推送类似{code: 10006, city: 'New York, NY'} 的东西...
    【解决方案2】:

    您还可以(取决于大量当前未知数)填充第二个数组,该数组保存第一个数组中填充条目的索引(索引?)。

    因此,您可以使用一种方法将整个数组放大一次,然后填充第二个数组:

    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 引擎肯定会做得很好,我敢肯定。)

    【讨论】:

      猜你喜欢
      • 2011-08-18
      • 1970-01-01
      • 2016-06-21
      • 2021-12-21
      • 1970-01-01
      • 2022-09-29
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      相关资源
      最近更新 更多