问题描述
我试过这种方式,但它给我错误的计数:
myArr = [];
myArr[666] = 'hello there';
console.log(myArr.length); // returns me 667
它应该是1.我怎样才能以最快的方式获得好的数量呢?
1楼
它应该是1。
不,它应该是667,因为这是JavaScript中标准数组的length定义,它 。
JavaScript中的数组本质上是稀疏的 ,这意味着它们中可能有漏洞(索引中不存储任何类型的值)。
我怎样才能以最快的方式获得好的数量呢?
唯一的方法是循环。 例如:
var count = 0;
myArr.forEach(function() {
++count;
});
console.log(count);
......或通过reduce如 。
forEach , reduce和其他此类仅访问实际存在的条目,因此它们跳过稀疏数组中的漏洞。
我应该提一下,因为IE8仍然(叹气)有相当大的市场份额,你需要shim forEach并reduce等等,如果你想使用它们。
(这很容易。)
要做到这一点没有任何垫片,只计算实际索引属性(而不是其他类型的属性),然后松散:
var count = 0, name;
for (name in myArr) {
if (myArr.hasOwnProperty(name) && /^[0-9]+$/.test(name)) {
++count;
}
}
它使用稍微宽松的索引属性名称定义; 如果你想要一个健壮的,请参阅 “正确使用”部分。
2楼
您可以使用reduce计算非未定义属性的数量
var length = myArr.reduce(function(len) { return len+1; }, 0);
console.log(length); // 1
3楼
因为数组的索引为0. [0...666]是667项。
如果您真的想要计算您拥有的项目数量,那么数组可能不是最佳解决方案。
4楼
您可以使用 。
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;
}