稀疏数组的长度

时间:2016-09-30 09:16:24

标签: javascript

我有一个数组将取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

如何将案例2 的长度设为1

9 个答案:

答案 0 :(得分:8)

许多答案建议循环遍历数组或创建一个新数组然后计算(_.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的权限,则仍会按照演示计算填充。因此,如果是这种情况,那么您需要在回调中对其进行说明,例如



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);




答案 1 :(得分: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




答案 2 :(得分:2)

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

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

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

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

正如@vlaz提到.reduce也会有用。

对于数字,我会使用Number.isInteger代替typeof value !== "undefined"来计算数字。

如果你确定数组中的值总是整数类型,你可以省略parseInt方法。

所以在下面的示例中,parseInt = 4,没有= 3

var arr = [];

arr[7] = 1;
arr[17] = null
arr[33] = 0;
arr[66] = undefined;
arr[77] = '7';
arr[99] = -7;
arr[9001] = false;


var count = arr.reduce((x, v) => Number.isInteger(parseInt(v)) ? x+1 : x, 0);

console.log(count);

希望这有帮助。

答案 3 :(得分:1)

您可以计算'键' (即填充的索引)数组:

Object.keys(arr).length

答案 4 :(得分: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




答案 5 :(得分:0)

我觉得这样的事情符合你的需要,虽然不清楚为什么要把元素放到第20位。

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

答案 6 :(得分:0)

第一个var a = []; to a.length返回数组中元素的长度

当你说[20] ='x'时;

数组实际上用21个元素初始化(第20个元素设置为你的值)并且记住21是数组中元素的数量

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

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

答案 7 :(得分:0)

使用arr.length属性将返回包括“&#39;

”在内的总长度

您可以使用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);

您还可以查看未定义的&#39;每个索引中的值并添加到count变量。但要谨慎使用&#39; undefined&#39;空洞&#39;空洞&#39;在数组中。

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

答案 8 :(得分:0)

另一种衬板解决方案是使用Filter。只需过滤出 truthy 值(尽管包括0)并找到长度。即使将值显式设置为undefined或任何其他 falsy

,此方法也将起作用

var a =[]
a[20] = 2;
a[10] = undefined;
a[15] = 0;
var x = (a.filter(i=> i===0||!!i )).length;
console.log(x)