Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBScript:查找数组中非空元素的数量_Vbscript - Fatal编程技术网

VBScript:查找数组中非空元素的数量

VBScript:查找数组中非空元素的数量,vbscript,Vbscript,在VBScript中确定数组中元素数的“最佳”方法是什么 UBound()告诉您已为数组分配了多少插槽,但没有告诉您已填充了多少插槽——根据具体情况,这些插槽的数量可能相同,也可能不同 没有内置内容来告诉您填充了哪些元素。最好的方法是在从数组中添加/删除元素时使用count变量自己跟踪这一点。我不知道有什么非迭代方法可以做到这一点,所以这里是迭代方法: Function countEmptySlots(arr) Dim x, c c = 0 For x = 0 To ub

在VBScript中确定数组中元素数的“最佳”方法是什么


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
是指未定义值还是有效值。If
Null
也意味着未定义,您需要您的
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 ....