2010-10-19 32 views
5

Tôi đang làm việc trên một hàm array_merge cho ASP cổ điển. Những gì tôi có vẻ là làm việc, cho đến khi một (hoặc cả hai) params có sản phẩm nào hoặc không mảng. Dưới đây là những gì tôi có cho đến nay:Mảng hợp nhất trong ASP cổ điển

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 

tôi nhận được lỗi:

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

Từ dòng merged(right_size + i + 1) = right(i). Bất kỳ sự khôn ngoan nào về nơi tôi đang đi sai?

+0

Đầu vào khi bạn gặp lỗi đó là gì? –

+2

Chỉ cần ném này ra khỏi đó - 'LEFT' và' RIGHT' là chức năng trong VBScript. Có thể là mã thực sự là barfing trên 'right (i)'? Bạn có thể muốn thay đổi tên tham số của hàm. – LittleBobbyTables

Trả lời

5

LittleBobbyTables đúng, bạn nên thay đổi các tham số.

Tôi nghĩ rằng tùy thuộc vào bạn đọc vào một kiểm tra thêm cho đối tượng có thể giải quyết vấn đề của bạn

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 

Một số 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

Thay vì lặp qua trái, tại sao không 'redim giữ lại (total_size)' và sau đó thêm giá trị của nó vào nó? –

0

Tôi biết câu hỏi này là một chút cũ, nhưng có cái gì đó bạn cần phải sửa chữa, để bạn có thể có được tất cả các giá trị từ hai mảng.

Bạn cần phải nâng cấp bộ đếm bên trong FOR thứ hai, giống như bạn đã làm trong lần đầu tiên. Nếu không, một trong các giá trị từ mảng thứ hai sẽ không được gán.

Hãy mã này là một ví dụ:

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

Tôi đang nhầm lẫn là một câu hỏi hay câu trả lời? – Lankymart

+0

Không rõ ràng rằng đây là một sự thay thế được đề xuất cho mã OP, giải quyết vấn đề này? Nó khai báo một hàm gọi là array_merge, và câu trả lời cho biết "bạn cần phải làm như vậy và như vậy để đạt được như vậy và như vậy". Tôi chưa xem xét mã chi tiết, nhưng tôi không rõ tại sao nó lại bị gắn cờ? Có lẽ nếu chúng ta thay thế "chúng ta" bằng "bạn" thì rõ ràng hơn đây có phải là câu trả lời không? – GreenAsJade

+0

@GreenAsJade Cảm ơn vì đã nhận thấy rằng đây là câu trả lời và chỉnh sửa nó nên nó rõ ràng hơn. Xin lỗi về lỗi khi xem lại bài đăng bị gắn cờ. –

0

cải thiện hiệu quả nhỏ để trả lời Paolo PTA của. Không cần phải lặp qua arr1; chỉ cần "redim bảo tồn" nó.

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 
Các vấn đề liên quan