VBScript:查找数组中非空元素的数量
在VBScript中确定数组中元素数的“最佳”方法是什么VBScript:查找数组中非空元素的数量,vbscript,Vbscript,在VBScript中确定数组中元素数的“最佳”方法是什么 UBound()告诉您已为数组分配了多少插槽,但没有告诉您已填充了多少插槽——根据具体情况,这些插槽的数量可能相同,也可能不同 没有内置内容来告诉您填充了哪些元素。最好的方法是在从数组中添加/删除元素时使用count变量自己跟踪这一点。我不知道有什么非迭代方法可以做到这一点,所以这里是迭代方法: Function countEmptySlots(arr) Dim x, c c = 0 For x = 0 To ub
UBound()告诉您已为数组分配了多少插槽,但没有告诉您已填充了多少插槽——根据具体情况,这些插槽的数量可能相同,也可能不同 没有内置内容来告诉您填充了哪些元素。最好的方法是在从数组中添加/删除元素时使用count变量自己跟踪这一点。我不知道有什么非迭代方法可以做到这一点,所以这里是迭代方法:
Function countEmptySlots(arr)
Dim x, c
c = 0
For x = 0 To ubound(arr)
If arr(x) = vbUndefined Then c = c + 1
Next
countEmptySlots = c
End Function
正如斯宾塞·鲁波特(Spencer Ruport)所说,最好从一开始就跟踪自己。首先,正如目前公认的答案所暗示的那样,没有名为
vbUndefined
的预定义标识符。该代码仅在脚本顶部没有显式选项时有效。如果你还没有使用选项Explicit
,那么就开始这样做吧,这会让你省去所有的悲伤
可以用来代替vbUndefined
的值为空
,例如:-
If arr(x) = Empty Then ...
Empty
是预定义的标识,是尚未分配值的变量或数组元素的默认值
然而,有一点需要注意。以下语句均显示为true:-
MsgBox 0 = Empty
MsgBox "" = Empty
MsgBox CDate("30 Dec 1899") = True
因此,如果您希望这些值中的任何一个都是数组元素的有效定义值,那么与Empty进行比较并不能减少它
如果您确实想确保元素是真正的“未定义”即“空”,请使用IsEmpty
函数:-
If IsEmpty(arr(x)) Then
IsEmpty
仅当参数确实正确为空时才会返回true
还有另一个问题,Null
是一个可能的值,可以保存在数组或变量中。然而:-
MsgBox Null = Empty
是运行时错误,“无效使用null”,并且:-
这是错误的。因此,您需要确定Null
是指未定义值还是有效值。IfNull
也意味着未定义,您需要您的If
语句如下所示:-
If IsEmpty(arr(x)) Or IsNull(arr(x)) Then ....
如果您知道Null
将永远不会被分配到数组中,则可以放弃此操作。这实际上与我想要的正好相反,但该技术在另一方面也同样有效(查找已填充的插槽,比较arr(x)vbUndefined)。请参阅AnthonyWJones提供的答案,以获得更全面的解决方案。为了子孙后代,我将选择的答案更改为AnthonyWJones给出的答案。(谢谢你,克里斯。)不要对x=0使用。有一个非常好的LBound(arr)
函数用于此。@nyrguds,我从未遇到过LBound(arr)
返回非零值的情况。什么时候会发生这种情况?你的评论非常棒,除了它与OP的原始问题毫无关系,而且什么也没做,只是浪费了我5分钟的时间,上帝只知道有多少天其他人偶然发现了这个问题。问题不是如何确定数组是否为空,或者空属性之间的细微差别,决定数组中有多少个元素。我不知道你为什么在自己的帖子中,把OP问题的答案省略掉,而把一个答案贴出来,对另一个你认为不正确的答案发表评论。
If IsEmpty(arr(x)) Or IsNull(arr(x)) Then ....