给出以下数组:
var arr = [undefined, undefined, 2, 5, undefined, undefined];
我想得到 定义的元素的数量(即:不 undefined
的元素)。除了遍历数组之外,还有一个很好的方法吗?
答案 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,了解我添加该警告的原因。)
你如何循环并统计它们取决于你。有很多方法:
for
到0
(包括)的标准arr.length - 1
循环。for..in
循环provided you take correct safeguards。some
或filter
,传入适当的函数。这很方便,不仅因为您不必显式编写循环,而且因为使用这些功能使JavaScript引擎有机会以各种方式优化内部循环。 (它实际上是否会因引擎而异。)...但这些都是显式的循环,或隐含地(在新数组特征的情况下)循环。
答案 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)))