【问题标题】:count empty values in array计算数组中的空值
【发布时间】:2011-06-07 13:30:53
【问题描述】:

给定一个数组:

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

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

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

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

【问题讨论】:

  • 我正在尝试找到最小的 sn-p

标签: javascript


【解决方案1】:

根据您对另一个答案的 cmets,您似乎在使用最短的方法。好吧,您可能需要考虑自己的示例的变体:

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

【讨论】:

  • 您的第一种方法行不通。为什么arr.length - 1 而不仅仅是arr.length
  • @vsync:它从 for 循环开始。当我更改它时,我忘记删除-1。已修复 :-) 在看到您对 @stecb 答案的评论后,我还添加了您自己方法的较短版本。
  • @vsync:如果你想让它变得更小,你可能想尝试在codegolf.stackexchange.com 上询问。如果你这样做,请告诉我,我会在那里发布我的答案。
【解决方案2】:

我觉得不错。

你也可以这样做:

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;

【讨论】:

  • 谢谢--我喜欢reduce--我认为被欣赏了
  • 你甚至可以在没有'y'参数的情况下进行recuttion,因为它无论如何都不会被使用
  • 是的——我只是为了冗余显示reduce可用的内容。
【解决方案3】:

或者,不使用 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

【讨论】:

  • 是的,但我试图找到最小的 sn-p,无论兼容性如何
  • 哦,我不知道“最小”:)
  • emptyElems != emptyLength
猜你喜欢
  • 2017-11-20
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多