计算数组中的空值

时间:2011-06-07 13:30:54

标签: javascript

给定一个数组:

var arr = [1,,2,5,6,,4,5,6,,];

计算有多少值:(长度 - 删除空值后的长度)

var empties = arr.length - arr.filter(function(x){ return true }).length;

// return 3

或类似的东西

arr.empties = arr.length;
arr.forEach(function(x){ arr.empties--  });

// arr.empties returns 3

这是最好的方式还是我错过了什么?

3 个答案:

答案 0 :(得分:18)

根据你对另一个答案的评论,看起来你是在用最短的方法之后。好吧,您可能想要考虑自己的例子的变体:

var empties = arr.length - arr.filter(String).length;

您所做的只是传递本机函数而不是匿名函数,从而节省了一些宝贵的字节。任何本机构造函数或函数都可以,只要它不返回布尔值。


您需要更具体地了解您认为的“最佳方式”。例如,某些方法会提供比其他方法更好的性能,有些方法更简洁,有些方法具有更好的兼容性。

您在帖子中提到的解决方案要求浏览器与ECMAScript第5版规范兼容,因此它们不适用于某些较旧的浏览器(读取:IE8及更低版本)。

“最佳”全能方法是一个简单的循环。它不像你的方法那么简洁,但毫无疑问是最快和最兼容的:

var arr = [1,,2,5,6,,4,5,6,,], count = 0, i = arr.length;

while (i--) {
    if (typeof arr[i] === "undefined")
        count++;
}

这使用了循环优化(使用while并且递减比for更快。)

另一种方法是对数组进行排序,以便undefined项都在最后并使用循环向后迭代:

var arr = [1,,2,5,6,,4,5,6,,], count = 0;
arr.sort();
while (typeof arr.pop() === "undefined") count++;

alert(count); 
//-> 3

这种方法会修改原始数组并删除那些可能不是您想要的项目。但是,可能在非常大的阵列上要快得多。

  

性能测试套件
  http://jsperf.com/count-undefined-array-elements

答案 1 :(得分:5)

对我来说很好。

你也可以这样做:

var empties = arr.reduce(function(x, y){ return x-1; }, arr.length);

此外,如果您不介意对数组进行排序,则可能会从以下方面获得一些额外的性能:

arr.sort();
for (var j=arr.length-1; j > 0 && arr[j] === undefined; j--) {}
var empties = arr.length-j-1;

答案 2 :(得分:1)

或者,不使用js 1.6 filter / foreach,你可以用这种方式自行循环:

var arr = [1,,2,5,6,,4,5,6,,];
var emptyElems = 0;
for(var i=0, l = arr.length; i < l; i++){
    emptyLength += (arr[i] === undefined) ? 1 : 0;
}

alert(emptyElems); //alerts 3