我试过这种方式,但它给了我错误的计数:
myArr = [];
myArr[666] = 'hello there';
console.log(myArr.length); // returns me 667
它应该是1.我怎样才能以最快的方式获得好计数?
答案 0 :(得分:17)
应该是1。
不,它应该是667,因为这是length
为JavaScript中的标准数组定义的var count = 0;
myArr.forEach(function() {
++count;
});
console.log(count);
aren't really arrays at all。 JavaScript中的数组本质上是稀疏的,这意味着它们中可能有漏洞(索引中不存储任何类型的值)。
我怎样才能以最快的方式获得好计数?
唯一的方法是循环。例如:
reduce
...或forEach
中的reduce
。 forEach
,reduce
和其他此类访问条目实际存在,因此它们会跳过稀疏数组中的漏洞。
我应该提一下,因为IE8仍然(叹气)拥有相当大的市场份额,如果你想使用它们,你需要在其上加var count = 0, name;
for (name in myArr) {
if (myArr.hasOwnProperty(name) && /^[0-9]+$/.test(name)) {
++count;
}
}
和<td>{{trans.Status}}</td>
<td>{{trans.PaymentId}}</td>
<td>{{trans.TransId || 'N\A'}}</td>
等。 (这很容易。)
要做到这一点,没有任何垫片,只计算实际的索引属性(而不是其他类型的属性),然后松散地:
mach_absolute_time()
使用略微宽松的索引属性名称定义;如果你想要一个健壮的,请参阅&#34;正确使用for-in&#34; maček's answer的一部分。
答案 1 :(得分:8)
您可以使用reduce
计算非未定义属性的数量var length = myArr.reduce(function(len) { return len+1; }, 0);
console.log(length); // 1
答案 2 :(得分:5)
因为数组的索引为0. [0...666]
是667个项目。如果您真的想要计算您拥有的物品数量,那么阵列可能不是最佳解决方案。
答案 3 :(得分:4)
您可以使用Object.keys()。
Object.keys(myArr).length;
来自文档:
Object.keys返回一个数组,其元素是对应的字符串 到直接在对象上找到的可枚举属性。订购 属性与循环遍历的属性相同 手动对象的属性。
此功能为compatible with IE9+。该文档还包含一个功能,可以添加该功能以在所有浏览器中兼容:
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;
}