2010-10-19 73 views
5

我正在處理ASP經典的array_merge函數。我似乎正在工作,直到一個(或兩個)參數爲空或不是數組。這是我到目前爲止有:ASP經典中的數組合並

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

當你發現錯誤時,輸入是什麼? – 2010-10-19 16:28:34

+2

只是拋出了這個 - 'LEFT'和'RIGHT'是VBScript中的函數。是否有可能代碼實際上是在「正確的(i)」上?您可能想要更改函數的參數名稱。 – LittleBobbyTables 2010-10-19 16:31:07

回答

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保留左(total_size)',然後將正確的值添加到它? – 2017-08-17 14:19:38

0

我知道這個問題是有點老了,但有的東西您需要修復,以便您可以從兩個數組中獲取所有值。

您需要升級第二個FOR內部的計數器,就像您在第一個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 2014-12-24 20:46:42

+0

是不是很清楚這是OP代碼的一個建議替代品,它解決了這個問題?它聲明瞭一個名爲array_merge的函數,答案是「你需要做某些事情來實現這樣的目標」。我沒有詳細審查代碼,但我不清楚它爲什麼甚至被標記?也許如果我們用「你」代替「我們」,這將是更清楚的,這是一個答案? – GreenAsJade 2014-12-25 01:33:46

+0

@GreenAsJade感謝您注意到這是一個答案,並對其進行編輯,使其更清晰。對於查看標記的帖子時出現的錯誤感到抱歉。 – 2014-12-25 03:11:09

0

小效率提高到保羅PTA的答案。沒有必要遍歷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