Array merge in ASP classic

5

I'm working on an array_merge function for ASP classic. What I have seems to be working, until one (or both) params are empty or not arrays. Here's what I have so far:

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

I get the error:

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

From the line merged(right_size + i + 1) = right(i). Any wisdom on where I'm going wrong?

arrays
function
asp-classic
merge
asked on Stack Overflow Oct 19, 2010 by Chris Tonkinson • edited Dec 24, 2014 by user692942

4 Answers

5

LittleBobbyTables is right, you should change the parameters.

I think depending on you inputs an extra check for object could solve your issue

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

Some 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")
answered on Stack Overflow Oct 19, 2010 by Yots • edited Oct 19, 2010 by Eduardo Molteni
1

Small efficiency improvement to Paolo Pta's answer. There's no need to iterate through arr1; just "redim preserve" it.

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
answered on Stack Overflow Aug 17, 2017 by Stephen R
0

I know this question is a bit old, but there is something that you need to fix, so that you can obtain all the values from the two arrays.

You need to upgrade the counter inside the second FOR, like you did on the first one. Otherwise one of the values from the second array wont be assigned.

Take this code as an example:

''//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
answered on Stack Overflow Dec 24, 2014 by Paulo Pta • edited Dec 25, 2014 by GreenAsJade
0

A few years later, but maybe someone can use it.

function array_merge(arr, arr2)
    for each elm in arr2
        redim preserve arr(UBound(arr) + 1)
        arr(UBound(arr)) = elm
    next

    array_merge = arr
end function
answered on Stack Overflow May 5, 2020 by Noe Aufdenblatten • edited May 5, 2020 by Noe Aufdenblatten

User contributions licensed under CC BY-SA 3.0