2016-09-30 255 views
1

我有一个数组将取n个值,但是这些值将被添加到不同的索引在不同的时间。但是,我需要在特定时间的阵列长度。稀疏数组的长度

案例1

var a = [1,2,3,3,4] 

a.length //Returns 5 - OK 

案例2

var a =[] 
a[20] = 2 
a.length //Returns 21 but I would like it to return 1 

如何获得长度1情况下2

+0

让它返回1的唯一方法是在其中只有1个元素...'a [0] = 2'或者你是否想要'length'返回数字具有价值的元素? – Archer

+3

为什么你想把元素放在第20位?如果没有,你可以‘我这样做,因为这是可能的‘’*这听起来有些不可思议使用'推” @PraneshRavi *推动要素英寸 – SachiDangalla

+0

’! –

回答

2

如果您可以使用underscorelodash。你可以试试这样的

var arrLen = _.compact(youArr).length; 

如果你想使用纯粹的JS ..你需要编写简单的功能。这将计算不等于假的元素数量。

var len = 0; 
arr.forEach(function(el){ 
    if (el) {count++;} 
}); 
console.log(len); 

希望这会有所帮助。

+1

你真棒。我正在用'lodash'而不是'underscore'。谢谢! –

3

如果您需要计数未未定义的元素个数:

var a = []; 
 
a[20] = 2; 
 

 
// count number of elements in a that are not undefined 
 
var count = a.filter(x => typeof x !== 'undefined').length; 
 

 
console.log(count); // prints 1

+1

或者,也可以不用创建一个新的数组来查看它有多少个元素,只需使用'.reduce()'返回一个数字。 – vlaz

0

您可以用Array#forEach计算的项目。

forEach()执行提供的回调一次本升序对数组中的每个元素。对于已删除或未初始化的索引属性(即在稀疏数组上),不会调用它。

var a = [1, 2, 3, 3, 4]; 
 

 
console.log(a.length); // 5 
 
a[20] = 2; 
 
console.log(a.length); // 21 
 
var length = 0; 
 
a.forEach(function() { length++; }); 
 
console.log(length); // 6

0

我认为像这样将满足您的需求,虽然目前还不清楚为什么你会放一个元素到第20位。

function dynlength(array) { 
    var length = 0; 
    for (var i = 0; i < array.length; i++) 
     if (array[i] !== undefined) length++; 
    return length; 
} 
0

first var a = []; 到阵列中元素的返回长度为

当你说一个[20] ='x';

阵列实际上得到21元(以设置为你的价值20元),初始化并记住21元素的数组中数

,如果你想自定义值尝试在循环迭代为

var count=0; 
for(var i=0;i<a.length;i++) 
{ 
if(a[i]!=undefined) 
    { 
    count++; 
    } 
} 
console.log(count); 
+0

'null'和'undefined'是两个不同的值。索引0-19处的元素将* undefined *,而不是null。 – Frxstrem

+0

yea..edited我的答案....只是试图把我的解决方案...将确保下次我没有犯错误..感谢指出...! :d – RohitS

0

使用arr.length属性将返回包含'洞'的总长度

您可以使用forEach()方法跳过数组中的孔。

var arr1 = []; 
var count = 0; 

arr1[20] = 2; 

alert(arr1.length);// this will always return including 'holes' 

arr1.forEach(function(ele, i) { //this will skip the holes and will take real values into account 
    count++; 
}); 
alert(count); 

您还可以检查每个索引中的“未定义”值并添加到count变量中。但要小心使用'未定义'来清空数组中的'洞'。

您可以检查http://speakingjs.com/es5/ch18.html#array_holes

2

很多问题的答案建议要么通过数组循环或创建一个新的数组,然后计算该(什么_.compact一样)。我认为所有这些都是错误的方法,因为使用.reduce使得这完全无关紧要。

var arr = []; 
 

 
arr[7] = 1; 
 
arr[17] = 2 
 
arr[33] = 0; 
 
arr[9001] = 4 
 

 
var count = arr.reduce(x => x+1, 0); 
 

 
console.log(count);

它是一条线或19个字节的代码来做到这一点。这是因为.reduce而不是经过数组中的空白点,因此它只会访问显式填充的indeces。然后就算这些。

要知道,如果你有明确设置为undefined任何的indeces,他们所证明仍然算作填充。所以,如果是这样的话,那么你就需要在回调考虑到它,例如

var arr = []; 
 

 
arr[17] = 2 
 
arr[42] = undefined 
 

 
var count = arr.reduce(x => x+1, 0); 
 
console.log(count); 
 

 
var filteredCount = arr.reduce((x, value) => typeof value !== "undefined" ? x+1 : x, 0); 
 
console.log(filteredCount);

0

可以算阵列的“钥匙”(即人口指数):

Object.keys(arr).length