【问题标题】:JS Array "Length" with non-consecutive index/key具有非连续索引/键的 JS 数组“长度”
【发布时间】:2016-08-10 17:47:05
【问题描述】:

如何获取以非连续数字为键的数组中的元素个数?

var array = [];  
array[5] = "something";  
array[10] = "nothing":  

预期:
数组中的元素数 = 2

实际:
相反,我得到最后一个用作“长度”的数字,11

我可以通过遍历每个元素来找出方法。有没有更好的方法来做到这一点?

【问题讨论】:

标签: javascript


【解决方案1】:

您可以计算非空单元格:

array.filter(function(e){return e!==undefined}).length

【讨论】:

  • 我认为你的方法是最好的,虽然array.filter(Boolean) 会更简洁。另外,你能解释一下你的答案吗?
  • @RobM。 Boolean 是什么?
  • @4castle 它是布尔值 (link) 的对象包装器。在filter 调用中,它可以作为一个身份函数,测试真实值
  • @RobM。啊,好样的。在这种情况下它可能会起作用,但它也会过滤掉可能是有效值的0 和""。
  • @Nosyara 正确。绝对不适用于所有用例,但根据 OP 发布的数据,我认为它在这里有效。
【解决方案2】:

听起来您真正想要的是字典,而不是数组。您是否认为这是一种替代数据结构?

How to do associative array/hashing in JavaScript

var myArray = {};
myArray["5"] = "something";
myArray["10"] = "nothing";

要获得长度,您需要编写一个快速函数,如下所示:

Length of a JavaScript object

Object.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

var size = Object.size(myArray);

或者,甚至更简单(但 IE8 不支持):

Object.keys(myArray).length

【讨论】:

  • Set 可能更有意义,因为它是您的代码的本机实现(并且包含 size 属性)
  • @RobM。是的,使用 Set.prototype 也是解决这个问题的好方法,而且资源效率更高。
  • 鉴于索引可能很重要,我认为Map 更接近。 Set 和 Map 的浏览器支持仍然很低。
  • @4castle 我正要评论说,“等等,实际上设置丢失了钥匙”所以是的,听起来钥匙很重要,所以 Map 会更好,上面的实现可能是比地图更有可能得到支持。
【解决方案3】:
var array = [];  
array[5] = "something";  
array[10] = "nothing": 

在这种情况下,您的数组变为:

[undefined,undefined,undefined,undefined,undefined,"something",undefined,undefined,undefined,undefined,"nothing"]

这就是长度为 11 的原因。所以理想情况下,您不应将其设置为数组 [5] 或数组 [10]。

如果你有可变键,那么你应该使用对象

a = {};    
a["5"] = "something";
a["10"] = "nothing"

然后一个看起来像{"5":"something","10":"nothing"}

然后你可以计算计数为:

var elemCount = 0;
for(var key in a){
elemCount++;
}

输出:

elemCount = 2

获取对象中键长度的各种其他方法: How to efficiently count the number of keys/properties of an object in JavaScript?

【讨论】:

    【解决方案4】:

    var array= Array(5);
    array[1] = 10;
    array[3] = 3;
    
    numberOfElements = 0;
    
    for(var i  =0; i<array.length; i++) {
    	if(array[i]!=undefined)
    		numberOfElements++;
    }
    alert(numberOfElements);

    【讨论】:

    • 您应该使用!== 运算符,以防用户将nulls 放入数组中。
    猜你喜欢
    • 2018-11-05
    • 1970-01-01
    • 2011-01-18
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 2018-01-19
    相关资源
    最近更新 更多