2010-10-19 7 views
5

Я работаю над функцией array_merge для ASP classic. Кажется, что я работаю, пока один (или оба) параметра не будут пустым или не будут массивами. Вот то, что я до сих пор:Array merge in ASP classic

function array_merge(left, right) 
    dim total_size 
    dim i 
    dim merged 
    ' Convert "left" to an array 
    if not isArray(left) then 
    left = Array(left) 
    end if 
    ' Convert "right" to an array 
    if not isArray(right) then 
    right = Array(right) 
    end if 
    ' Start with "left" and add the elements of "right" 
    right_size = ubound(right) 
    total_size = ubound(left) + right_size + 1 
    merged = left 
    redim preserve merged(total_size) 
    for i = 0 to ubound(right) 
    merged(right_size + i + 1) = right(i) 
    next 
    ' Return value 
    array_merge = merged 
end function 

Я получаю ошибку:

 
Error Type: 
Microsoft VBScript runtime (0x800A01B6) 
Object doesn't support this property or method: 'merged' 
/_inc/nav/left-nav.inc, line 21 

От линии merged(right_size + i + 1) = right(i). Любая мудрость, где я ошибаюсь?

+0

Каков был вход, когда вы получили эту ошибку? –

+2

Просто выбросьте это - 'LEFT' и' RIGHT' являются функциями в VBScript. Возможно ли, что код фактически работает на 'right (i)'? Возможно, вы захотите изменить имена параметров функции. – LittleBobbyTables

ответ

5

LittleBobbyTables прав, вы должны изменить параметры.

Я думаю, что зависит от вас вводит дополнительные проверки для объекта может решить вашу проблему

function array_merge(left, right) 
    dim right_size 
    dim total_size 
    dim i 
    dim merged 
    ''// Convert "left" to an array 
    if not isArray(left) then 
    left = Array(left) 
    end if 
    ''// Convert "right" to an array 
    if not isArray(right) then 
    right = Array(right) 
    end if 
    ''// Start with "left" and add the elements of "right" 

    right_size = ubound(right) 
    total_size = ubound(left) + right_size + 1 

    merged = array() 
    redim merged(total_size) 
    dim counter : counter = 0 

    for i = lbound(left) to ubound(left) 
    if isobject(left(i))then 
     set merged(counter) = left(i) 
    else 
     merged(counter) = left(i) 
    end if 
    counter=counter+1 
    next 

    for i = lbound(right) to ubound(right) 
    if isobject(right(i))then 
     set merged(counter) = right(i) 
    else 
     merged(counter) = right(i) 
    end if 
    next 


    ''// Return value 
    array_merge = merged 
end function 

Некоторые Testcode:

dim a: a=100 
dim b: b=200 

dim c: set c=nothing 
dim d: set d=nothing 

dim e: set e=server.createobject("scripting.filesystemobject") 
dim f: set f=server.createobject("scripting.filesystemobject") 


dim x,y,z,zz 

x = array_merge(a,b) 
y = array_merge(c,d) 
z = array_merge(e,f) 
zz = array_merge(a,e) 

response.write x(0) 
response.write x(1) 

''// Accessing Nothing Values throw Error 
''//response.write y(0) 
''//response.write y(1) 

response.write z(0).GetExtensionName("test.doc") 
response.write z(1).GetExtensionName("test.doc") 

response.write zz(0) 
response.write zz(1).GetExtensionName("test.doc") 
+0

Вместо того, чтобы повторять по левому краю, почему бы не «redim сохранить left (total_size)», а затем добавить в него значения правого? –

0

Я знаю, что этот вопрос немного старый, но есть кое-что вам нужно исправить, чтобы вы могли получить все значения из двух массивов.

Вам необходимо обновить счетчик внутри второго FOR, как и на первом. В противном случае не будет назначено одно из значений из второго массива.

Возьмите этот код в качестве примера:

''//Build the Arrays 

Dim a,b,c 
a=array("a1","a2") : b=array("b1","b2") : c=array_merge(a,b) 

''//Run the code 

For Each i In c 
    Response.Write i &"<br />" 
    Next 

''//The main function 

Function array_merge(arr1, arr2) 
    ''//Declare all function variables 
    dim arr1_size,arr2_size,total_size,i,merged,counter 

    ''//Fix empty or none arrays 
    if not isArray(arr1) then arr1 = Array(arr1) end if 
    if not isArray(arr2) then arr2 = Array(arr2) end if 

    ''// Get and set the Arrays Size 
    arr1_size = ubound(arr1) : arr2_size = ubound(arr2) 
    total_size = arr1_size + arr2_size + 1 

    ''//Create a temporary array and assign it a size 
    merged = array() 
    redim merged(total_size) 
    counter = 0 

    ''//Create one single Array with the two others by looping them 
    For i = lbound(arr1) to ubound(arr1) 
     IF isobject(arr1(i)) then 
     set merged(counter) = arr1(i) 
     Else 
     merged(counter) = arr1(i) 
     End if 
     counter=counter+1 
     Next 
    For i = lbound(arr2) to ubound(arr2) 
    If isobject(arr2(i))then 
     set merged(counter) = arr2(i) 
     Else 
     merged(counter) = arr2(i) 
     End if 
     counter=counter+1 
     Next 

    ''// Return the value 
    array_merge = merged 
    End Function 
+0

Я смущен, это вопрос или ответ? – Lankymart

+0

Не ясно ли, что это предлагаемая замена кода OP, которая решает проблему? Он объявляет функцию, называемую array_merge, и ответ говорит: «вам нужно делать то-то и то-то, чтобы достичь такого-то». Я не просмотрел код в деталях, но я не понимаю, почему его даже подмечают? Может быть, если мы заменим «мы» на «вас», было бы ясно, что это ответ? – GreenAsJade

+0

@GreenAsJade Спасибо, что заметили, что это ответ и редактирование, чтобы оно стало яснее. Извините за ошибку при просмотре отмеченных сообщений. –

0

небольшое улучшение эффективности в ответ Паоло РТА в. Нет необходимости перебирать через arr1; просто "redim сохранить" его.

Function array_merge(arr1, arr2) 
    dim arr1_size, arr2_size, total_size, i, counter 
    if not isArray(arr1) then arr1 = Array(arr1) 
    if not isArray(arr2) then arr2 = Array(arr2) 

    arr1_size = ubound(arr1) : arr2_size = ubound(arr2) 
    total_size = arr1_size + arr2_size + 1 
    counter = arr1_size + 1 
    Redim Preserve arr1(total_size) 
    For i = lbound(arr2) to arr2_size 
     If isobject(arr2(i))then 
      set arr1(counter) = arr2(i) 
     Else 
      arr1(counter) = arr2(i) 
     End if 
     counter = counter + 1 
    Next 
    array_merge = arr1 
End Function