2010-10-19 24 views
5

Sto lavorando su una funzione array_merge per ASP classic. Quello che sembra sembra funzionare, fino a quando uno (o entrambi) parametri sono vuoti o non matrici. Ecco quello che ho finora: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 

ottengo l'errore:

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

Dalla linea merged(right_size + i + 1) = right(i). Qualche saggezza su dove sto andando male?

+0

Qual è stato l'input quando hai ricevuto quell'errore? –

+2

Basta lanciare questo fuori là - 'SINISTRA' e' DESTRA' sono funzioni in VBScript. È possibile che il codice sia in realtà barfing su 'right (i)'? Potresti voler cambiare i nomi dei parametri della funzione. – LittleBobbyTables

risposta

5

LittleBobbyTables ha ragione, è necessario modificare i parametri.

Penso a seconda che si immette un controllo supplementare per oggetto potrebbe risolvere il problema

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 

Alcuni 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

Invece di scorrere a sinistra, perché non 'redim preservare left (total_size)' e quindi aggiungere i valori di right ad esso? –

0

So che questa domanda è un po 'vecchio, ma c'è qualcosa che è necessario correggere, in modo da poter ottenere tutti i valori dai due array.

devi aggiornare il contatore all'interno del secondo per, come avete fatto sul primo. Altrimenti non verrà assegnato uno dei valori dal secondo array.

prendere questo codice come un esempio:

''//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

Sono confuso è una domanda o una risposta? – Lankymart

+0

Non è chiaro che si tratta di una proposta di sostituzione per il codice dell'OP, che risolve il problema? Dichiara una funzione chiamata array_merge, e la risposta dice "è necessario eseguire tale e tale per ottenere tale e così". Non ho esaminato il codice in dettaglio, ma non sono chiaro perché viene addirittura contrassegnato? Forse se sostituiamo "noi" con "tu" sarebbe più chiaro che questa è una risposta? – GreenAsJade

+0

@GreenAsJade Grazie per aver notato che questa è una risposta e la modifica in modo che sia più chiara. Mi dispiace per l'errore durante la revisione dei post segnalati. –

0

piccolo miglioramento dell'efficienza alla risposta di Paolo Pta. Non è necessario eseguire iterazioni con arr1; solo "redim preservare" esso.

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 
Problemi correlati