首页 > 解决方案 > 我的数组比较代码出了什么问题?

问题描述

当我给它提供多个值时,我的数组比较函数工作正常。但是当两个数组都只包含一个值时,它就不能正常工作。

工作比较脚本:

<%
Function InArray(Needle, Haystack)
    Dim i, x
    InArray = False
    If UBound(Haystack)>0 Then
        For i = 0 To Ubound(Haystack)
            If IsArray(Needle) = True Then
                For x = 0 To Ubound(Needle)
                    If Trim(Haystack(i)) = Trim(Needle(x)) Then
                        InArray = True
                        Exit Function
                    End If
                Next
            Else
                If Trim(Haystack(i)) = Trim(Needle) Then
                    InArray = True
                    Exit Function
                End If
            End If
        Next
    end if  
End Function

Dim HRMarray: HRMarray=array(459,14,2345)
Dim ADSarray: ADSarray=array(459,123,14,3345)

For Each HRMemployee In HRMarray
    If (inarray(HRMemployee,ADSarray) = False)  then
        response.write HRMemployee& " missing in ADSarray <br>" 
    end if
Next

For Each ADSemployee In ADSarray
    If (inarray(ADSemployee,HRMarray) = False)  then
        response.write ADSemployee& " to much in ADSarray <br>" 
    end if
Next
%>

好的输出:

ADSarray 中缺少 2345
123 到 ADSarray 中的很多
3345 到 ADSarray 中的很多

不工作的比较脚本:

<%
Function InArray(Needle, Haystack)
    Dim i, x
    InArray = False
    If UBound(Haystack)>0 Then
        For i = 0 To Ubound(Haystack)
            If IsArray(Needle) = True Then
                For x = 0 To Ubound(Needle)
                    If Trim(Haystack(i)) = Trim(Needle(x)) Then
                        InArray = True
                        Exit Function
                    End If
                Next
            Else
                If Trim(Haystack(i)) = Trim(Needle) Then
                    InArray = True
                    Exit Function
                End If
            End If
        Next
    end if  
End Function

Dim HRMarray: HRMarray=array(459)
Dim ADSarray: ADSarray=array(459)

For Each HRMemployee In HRMarray
    If (inarray(HRMemployee,ADSarray) = False)  then
        response.write HRMemployee& " missing in ADSarray <br>" 
    end if
Next

For Each ADSemployee In ADSarray
    If (inarray(ADSemployee,HRMarray) = False)  then
        response.write ADSemployee& " to much in ADSarray <br>" 
    end if
Next
%>

挪威克朗输出:

ADSarray 中缺少
459 459 到 ADSarray 中很多

此输出不正确,因为两个数组都包含相同的内容,因此它根本不应该提供任何输出。

我希望有人看到这里出了什么问题。

问候,

弗兰斯

标签: arraysvbscriptasp-classiccomparison

解决方案


省略该If UBound(Haystack)>0 Then行(以及相应的行end if),或将其更改为If UBound(Haystack) >= 0 Then.

说明:UBound函数返回0一个元素数组,-1一个空数组(无元素数组)。

使用以下测试脚本的证明:

option explicit
Dim HRMarray: HRMarray=array(459)
Dim ADSarray: ADSarray=array()
Dim strRes
strRes = _
    UBound( HRMarray) & vbTab & varType( HRMarray) & vbTab & typeName( HRMarray) _
  & vbNewLine _
  & UBound( ADSarray) & vbTab & varType( ADSarray) & vbTab & typeName( ADSarray)
Wscript.Echo strRes

结果:

==> cscript .\SO\56611737a.vbs
0       8204    Variant()
-1      8204    Variant()

推荐阅读