我有一个数组将取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
?
答案 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)
如果您可以使用underscore或lodash。你可以试试这个
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;在数组中。
答案 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)