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

时间:2012-03-28 06:04:34

标签: javascript undefined

给出以下数组:

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

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

7 个答案:

答案 0 :(得分:57)

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

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);

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

答案 1 :(得分:10)

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

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

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

答案 2 :(得分:2)

不,知道有多少元素未定义的唯一方法是循环并计算它们。这并不意味着必须编写循环,但是,某些地方必须这样做。 (请参阅下面的#3,了解我添加该警告的原因。)

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

  1. for0(包括)的标准arr.length - 1循环。
  2. for..in循环provided you take correct safeguards
  3. 来自ECMAScript5的几个新阵列功能中的任何一个(假设您使用的是支持它们的JavaScript引擎,或者您已经包含了ES5垫片,因为它们都是可以填充的),例如{{3} },somefilter,传入适当的函数。这很方便,不仅因为您不必显式编写循环,而且因为使用这些功能使JavaScript引擎有机会以各种方式优化内部循环。 (它实际上是否会因引擎而异。)
  4. ...但这些都是显式的循环,或隐含地(在新数组特征的情况下)循环。

答案 3 :(得分:0)

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

编辑:

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

<击>

答案 4 :(得分:0)

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

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; }
})

答案 5 :(得分:0)

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

var len = 0;
for (var i in arr) { len++ };
如果你没有明确地设置它们,那么

未定义是隐含的

//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

答案 6 :(得分:0)

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

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

使用Lodash

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