Javascript 如何获得数组的实际计数?
我尝试过这种方法,但它返回了错误的计数:Javascript 如何获得数组的实际计数?,javascript,arrays,count,size,Javascript,Arrays,Count,Size,我尝试过这种方法,但它返回了错误的计数: myArr = []; myArr[666] = 'hello there'; console.log(myArr.length); // returns me 667 应该是1。如何以最快的方式获得好的计数?因为数组的索引是0[0…666]是667项。如果您确实想要计算您拥有多少项,那么数组可能不是最佳解决方案 应该是1 不,应该是667,因为这就是JavaScript中标准数组的length定义方式。JavaScript中的数组本质上是稀疏的,这意
myArr = [];
myArr[666] = 'hello there';
console.log(myArr.length); // returns me 667
应该是1。如何以最快的方式获得好的计数?因为数组的索引是0<代码>[0…666]是667项。如果您确实想要计算您拥有多少项,那么数组可能不是最佳解决方案 应该是1 不,应该是667,因为这就是JavaScript中标准数组的
length
定义方式。JavaScript中的数组本质上是稀疏的,这意味着它们可能有漏洞(索引中不存储任何类型的值)
我怎样才能以最快的方式获得好的计数
唯一的方法是循环。例如:
var count = 0;
myArr.forEach(function() {
++count;
});
console.log(count);
…或通过中的减少forEach
,reduce
,以及其他类似的只访问实际存在的条目,因此它们跳过稀疏数组中的漏洞
我应该提到的是,由于IE8仍然(叹气)拥有相当大的市场份额,如果您想使用它们,您需要为每个forEach
和reduce
等添加垫片。(这很容易。)
要在没有任何填隙的情况下执行此操作,并且只计算实际索引属性(而不是其他类型的属性),请执行以下操作:
var count = 0, name;
for (name in myArr) {
if (myArr.hasOwnProperty(name) && /^[0-9]+$/.test(name)) {
++count;
}
}
对索引属性名称的定义有点松散;如果您想要一个健壮的,请参阅的“正确使用”部分。您可以使用
从文件中:
key返回一个数组,其元素是对应的字符串
指向直接在对象上找到的可枚举属性。订单
属性的值与通过在
手动设置对象的属性
此函数是。该文档还包含一个功能,可添加该功能以在所有浏览器中实现兼容性:
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;
}
您可以使用reduce计算未定义属性的数量
var length = myArr.reduce(function(len) { return len+1; }, 0);
console.log(length); // 1
在js中,数字0类似于数字1。这就是你得到667的原因。我们在同一页上,但是减少可能有点干净没有问题+1用于提供额外教育。如果您想要快速方式reduce
option@DaveGomez:reduce
并不慢。如果您担心函数调用的成本,@DaveGomez:重复“它很慢”并不能说明这是真的filter
不会再快了——我猜在任何大小的数组上都会慢一些,因为将条目推入数组比向值中添加一个要慢。也会导致更多内存流失(临时数组)。请注意,对象。键
还将包括名称非索引可枚举属性(如果存在)。警告:对象。键
在IE 8/7/6中不可用。@gusper:如果您正在处理过时的浏览器,它可能会被填充。@T.J.Crowder True,但如果知道默认情况下它不会工作,那就太好了。@gusper我想我应该把它作为一个可能的答案。可以查看完整的兼容性报告。我想知道有什么是无法阅读的。这太完美了。@canon是的,你必须把所有东西都放在这里。有些人不知道他们在说什么。我并不声称自己什么都知道,但我尽量避免提供缺乏确定性的答案。
var length = myArr.reduce(function(len) { return len+1; }, 0);
console.log(length); // 1