计数具有'仅限非数字索引'没有for在循环中

Count length of Array having 'non numeric indexes only' without for in loop

本文关键字:没有 索引 for 数字 循环      更新时间:2023-09-26

如果索引是非数字的,则数组定义长度=0。

我遇到了这种获取长度的实现,但我仍然害怕将for用于数组的循环中。循环中的大多数地方都被指示为"不良做法"。参见此处

这样实施可以吗?

有人能提供替代解决方案吗(没有for in loop)?

有for循环的例子吗

我使用了hasOwnProperty(..)方法来避免Array.prototype的性质。

Array.prototype.global = 1;
var arr = [];
arr['first'] = 1;
arr['second'] = 2;
console.log(arr.length);  //0
var length = 0;
for(index in arr){
   if(arr.hasOwnProperty(index)) {length++;}
}
console.log(length); //3

在您的示例中,不再使用数组作为数组。JS中的数组(严格来说)只是一堆这样的东西:

['a', 'b', 'c']

您所做的是开始使用空数组作为对象。。[]simple通过字符串/变量访问属性。。。所以

var obj = {test: 'blah'}
obj['test'] //is 'blah'
obj.test //is also blah

通常,当您要通过变量访问属性或方法时,或者如果属性或方法不是"安全"的,则使用[]表示法。。例如"int"。

因此,将您所拥有的内容更改为对象,然后使用"for in"循环遍历关键帧。是的,你仍然需要检查每一个,看看它是否有OwnProperty(或者使用jquery/下划线"each"),但至少你会使用正确的工具来完成这项工作:)或者,如果你只想要键的计数,underscore.js有一个很好的小_.keys方法。。所以_.keys(obj).length会给出键的数量。很确定这只是本地密钥,而不是原型密钥。。

编辑:作为一个重读的答案,希望能更好地切中要害,据我所知,JS中没有任何属性可以简单地获得键的计数。如果它只是你正在处理的一个特定的东西,而不是"所有的对象",你可以做这样的事情。。

var specialObject = function () {this.keys = 0;};
specialObject.prototype.set = function (key, val)  {
    if(!this[key]) {
       this.keys++;
    }
    this[key] = val;
};
var so = new specialObject();
so.set('test', 'blah');
so.keys //would be 1
so.test //would be 'blah'

然后总是使用"set"。您可能想要制作一个"unset"方法,也可能是一个"get"方法。

希望这一切都有意义。。这有点乱。