Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何获得数组的实际计数?_Javascript_Arrays_Count_Size - Fatal编程技术网

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