"已定义"数组元素的计数

Eri*_*rik 32 javascript undefined

给出以下数组:

var arr = [undefined, undefined, 2, 5, undefined, undefined];
Run Code Online (Sandbox Code Playgroud)

我想获得哪些元素的计数定义(即:那些 undefined).除了遍历数组之外,还有一个很好的方法吗?

ZER*_*ER0 57

在最近的浏览器中,您可以使用过滤器

var size = arr.filter(function(value) { return value !== undefined }).length;

console.log(size);
Run Code Online (Sandbox Code Playgroud)

另一种方法,如果浏览器支持数组的indexOf:

var size = arr.slice(0).sort().indexOf(undefined);
Run Code Online (Sandbox Code Playgroud)

如果对于荒谬,你在数组中只有一位数的元素,你可以使用那个肮脏的技巧:

console.log(arr.join("").length);
Run Code Online (Sandbox Code Playgroud)

您可以使用几种方法,但最后我们必须看看它是否真的值得做而不是循环.

  • 正如你所说,我们应该尝试并保持符合标准的javascript(ECMAScript),我完全同意你的看法!而`filter`是ECMA的一部分.它也不是那么新(ES5,而不是6).幸运的是,与其他产品相比,ES标准是易于聚合的标准之一.我的回复中的链接也提供了polyfill.如果我们为网络开发,我的建议总是包括用于ES5方法的polyfill; 现在阻止自己去ES3是没有意义的. (5认同)

tas*_*oor 10

数组length不是数组中元素的数量,它是最高的index + 1.length仅当连续索引中存在有效元素时,属性才会报告正确的元素计数.

var a = [];
a[23] = 'foo';
a.length;  // 24
Run Code Online (Sandbox Code Playgroud)

这样说,没有使用任何形式的循环就无法从计数中排除未定义的元素.