当前位置: 代码迷 >> JavaScript >> 我怎样才能获得数组的实际数量?
  详细解决方案

我怎样才能获得数组的实际数量?

热度:45   发布时间:2023-06-06 09:35:44.0

我试过这种方式,但它给我错误的计数:

myArr = [];
myArr[666] = 'hello there';
console.log(myArr.length); // returns me 667

它应该是1.我怎样才能以最快的方式获得好的数量呢?

它应该是1。

不,它应该是667,因为这是JavaScript中标准数组的length定义,它 。 JavaScript中的数组本质上是稀疏的 ,这意味着它们中可能有漏洞(索引中不存储任何类型的值)。

我怎样才能以最快的方式获得好的数量呢?

唯一的方法是循环。 例如:

var count = 0;
myArr.forEach(function() {
    ++count;
});
console.log(count);

......或通过reduce如 。 forEachreduce和其他此类仅访问实际存在的条目,因此它们跳过稀疏数组中的漏洞。


我应该提一下,因为IE8仍然(叹气)有相当大的市场份额,你需要shim forEachreduce等等,如果你想使用它们。 (这很容易。)

要做到这一点没有任何垫片,只计算实际索引属性(而不是其他类型的属性),然后松散:

var count = 0, name;
for (name in myArr) {
    if (myArr.hasOwnProperty(name) && /^[0-9]+$/.test(name)) {
        ++count;
    }
}

它使用稍微宽松的索引属性名称定义; 如果你想要一个健壮的,请参阅 “正确使用”部分。

您可以使用reduce计算非未定义属性的数量

var length = myArr.reduce(function(len) { return len+1; }, 0);
console.log(length); // 1

因为数组的索引为0. [0...666]是667项。 如果您真的想要计算您拥有的项目数量,那么数组可能不是最佳解决方案。

您可以使用 。

Object.keys(myArr).length;

从文档:

Object.keys返回一个数组,其元素是与直接在对象上找到的可枚举属性相对应的字符串。 属性的顺序与手动循环对象的属性所给出的顺序相同。

此功能 。 该文档还包含一个功能,可以添加到所有浏览器的兼容性:

if (!Object.keys) Object.keys = function(o) {
  if (o !== Object(o))
    throw new TypeError('Object.keys called on a non-object');
  var k=[],p;
  for (p in o) if (Object.prototype.hasOwnProperty.call(o,p)) k.push(p);
  return k;
}
  相关解决方案