只是想知道,当你使用array.length
时,它会获得最后一个索引值并添加一个。如果你有一个数组,由于某种原因以这种方式定义,该怎么办:
var myArray2 =[];
myArray2[10]='x';
myArray2[55]='x';
获得此阵列真实长度的绝对最佳方法是什么?可以返回2作为值的东西。
我正在考虑这样的事情,但不确定是否已有一种方法,或者是否有更快的实施。
Array.prototype.trueLength= function(){
for(var i = 0,ctr=0,len=myArray2.length;i<len;i++){
if(myArray2[i]!=undefined){
ctr++;
}
}
return ctr;
}
console.log(myArray2.trueLength());
答案 0 :(得分:10)
Array.prototype.reduce
仅遍历现有索引,因此您可以执行以下操作:
var length = myArray2.reduce(function(sum) {
return sum+1;
}, 0);
“但是齐拉克叔叔!reduce
杀死了我的父母!”别担心,年轻人,我们可以使用Array.prototype.filter
!
var length = myArray2.filter(function(item, idx) {
return idx in myArray2;
}).length;
“所有这些阵列都很无聊!”嗯,whadya想到这个!?
Object.keys(myArray2).length;
“但是......但是......但Zirak !!!!我们是阿米什人,我们还没有ECMAScript 5!”不要害怕,齐拉克在这里!
for (var length = 0, i = 0; i < myArray2.length; i++) {
if (i in myArray2) {
length += 1;
}
}
但有时这样,人们不禁要问:为什么要这样做并且违背数组的目的,一个结构化的构造,而不是使用其他适合其目的的东西?
答案 1 :(得分:2)
使用for in
迭代数组。 jsfiddle
Array.prototype.trueLength= function(){
var ctr = 0;
for(var i in this){
if(this.hasOwnProperty(i)){
ctr++;
}
}
return ctr;
}
console.log(myArray2.trueLength());
答案 2 :(得分:1)
替代原型方法:
Array.prototype.trueLength= function(){
var list= [], ctr = 0, array = this;
for(var i in array) (function(arr) {
if(array.hasOwnProperty(i)){
list.push(arr);
ctr++;
};
}(array[i]));
return {length: ctr, "list": list}
}
样品:
var myArray2 =[];
myArray2[10]='44';
myArray2[55]='55';
// list not undefined
myArray2.trueLength().list // ["44", "55"]
// not undefined length list
myArray2.trueLength().length // 2
答案 3 :(得分:0)
我使用the in
operator:
function getArrayPropertyCount(arr) {
var count = 0;
for (var i = 0, len = arr.length; i < len; ++i) {
if (i in arr) {
++count;
}
}
return count;
}
答案 4 :(得分:0)
function TrueArrayLength (myArray2)
{
var TrueLength = 0;
for ( var i = 0; i < myArray2.length; i++)
{
if (i in myArray2)
{
TrueLength += 1;
}
}
return TrueLength;
}
使用此函数并获得真正的数组长度。