繁体   English   中英

“已定义”数组元素的计数

[英]Count of “Defined” Array Elements

给出以下数组:

var arr = [undefined, undefined, 2, 5, undefined, undefined];

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

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

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

console.log(size);

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

var size = arr.slice(0).sort().indexOf(undefined);

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

console.log(arr.join("").length);

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

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

var a = [];
a[23] = 'foo';
a.length;  // 24

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

不,知道有多少元素未定义的唯一方法是循环并计算它们。 这并不意味着必须编写循环,只是某些东西,某处必须这样做。 (参见下面的#3,为什么我添加了这个警告。)

你如何循环并计算它们取决于你。 有很多方法:

  1. 一个标准的for从循环0arr.length - 1 (含)。
  2. for..in循环中,您可以采取正确的安全措施
  3. 来自ECMAScript5的几个新阵列功能中的任何一个(假设你使用的是支持它们的JavaScript引擎,或者你已经包含了一个ES5垫片,因为它们都是可以填充的),比如somefilterreduce ,传递适当的功能。 这很方便,不仅因为您不必显式编写循环,而且因为使用这些功能使JavaScript引擎有机会以各种方式优化内部循环。 (它实际上是否会因引擎而异。)

...但这一切都等于显式地循环,或者(在新数组特征的情况下)隐式地循环。

如果未定义的是隐式的,那么你可以这样做:

var len = 0;
for (var i in arr) { len++ };

如果不明确设置,则undefined是隐式的

//both are a[0] and a[3] are explicit undefined
var arr = [undefined, 1, 2, undefined];

arr[6] = 3;
//now arr[4] and arr[5] are implicit undefined

delete arr[1]
//now arr[1] is implicit undefined

arr[2] = undefined
//now arr[2] is explicit undefined

删除值然后检查(如果需要,删除null检查)

const x = A.filter(item => item !== undefined || item !== null).length

随着Lodash

const x = _.size(_.filter(A, item => !_.isNil(item)))

不幸的是,不,你必须经历一个循环并计算它们。

编辑:

 
 
 
  
  var arrLength = arr.filter(Number); alert(arrLength);
 
  

在所有浏览器中循环和计数:

var cnt = 0;
for (var i = 0; i < arr.length; i++) {
    if (arr[i] !== undefined) {
        ++cnt;
    }
}

在现代浏览器中:

var cnt = 0;
arr.foreach(function(val) {
    if (val !== undefined) { ++cnt; }
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM