Что не так в моем коде сравнения массивов? - PullRequest
0 голосов
/ 15 июня 2019

Моя функция сравнения массивов работает нормально, когда я добавляю в нее несколько значений. Но когда оба массива содержат только одно значение, это не работает правильно.

Рабочий скрипт сравнения:

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

Выход Oke:

2345 отсутствует в ADSarray
От 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
%>

Вывод NOK:

459 отсутствует в ADSarray
459 на много в ADSarray

Этот вывод не является окейским, поскольку оба массива содержат одинаковое содержимое, поэтому он вообще не должен выдавать вывод.

Надеюсь, кто-то увидит, что здесь не так.

С уважением,

Frans

1 Ответ

3 голосов
/ 15 июня 2019

Пропустить строку 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()
...