给定一个数组:
var arr = [1,,2,5,6,,4,5,6,,];
Run Code Online (Sandbox Code Playgroud)
计算有多少空值:(长度 - 删除空值后的长度)
var empties = arr.length - arr.filter(function(x){ return true }).length;
// return 3
Run Code Online (Sandbox Code Playgroud)
或类似的东西
arr.empties = arr.length;
arr.forEach(function(x){ arr.empties-- });
// arr.empties returns 3
Run Code Online (Sandbox Code Playgroud)
这是最好的方式还是我错过了什么?
And*_*y E 20
根据你对另一个答案的评论,看起来你是在用最短的方法之后.好吧,您可能想要考虑自己的示例的变体:
var empties = arr.length - arr.filter(String).length;
Run Code Online (Sandbox Code Playgroud)
您所做的只是传递本机函数而不是匿名函数,从而节省了一些宝贵的字节.任何本机构造函数或函数都可以,只要它不返回布尔值.
您需要更具体地了解您认为的"最佳方式".例如,某些方法会提供比其他方法更好的性能,有些方法更简洁,有些方法具有更好的兼容性.
您在帖子中提到的解决方案要求浏览器与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++;
}
Run Code Online (Sandbox Code Playgroud)
这使得循环优化(使用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
Run Code Online (Sandbox Code Playgroud)
这种方法会修改原始数组并删除那些可能不是您想要的项目.但是,在非常大的阵列上可能要快得多.
在我看来很好.
你也可以这样做:
var empties = arr.reduce(function(x, y){ return x-1; }, arr.length);
Run Code Online (Sandbox Code Playgroud)
此外,如果您不介意对数组进行排序,您可能会获得一些额外的性能:
arr.sort();
for (var j=arr.length-1; j > 0 && arr[j] === undefined; j--) {}
var empties = arr.length-j-1;
Run Code Online (Sandbox Code Playgroud)