【问题标题】:Array merge in ASP classicASP 经典中的数组合并
【发布时间】:2011-04-27 14:09:42
【问题描述】:

我正在为 ASP 经典开发一个 array_merge 函数。我所拥有的似乎正在工作,直到一个(或两个)参数为空或不是数组。这是我目前所拥有的:

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

我得到错误:

错误类型: Microsoft VBScript 运行时 (0x800A01B6) 对象不支持此属性或方法:“合并” /_inc/nav/left-nav.inc,第 21 行

来自merged(right_size + i + 1) = right(i) 行。关于我哪里出错了有什么智慧吗?

【问题讨论】:

  • 收到该错误时的输入是什么?
  • 只是把它扔在那里 -- LEFTRIGHT 是 VBScript 中的函数。代码是否可能实际上是在right(i) 上吐槽?您可能想要更改函数的参数名称。

标签: arrays function asp-classic merge


【解决方案1】:

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

一些测试代码:

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")

【讨论】:

  • 为什么不遍历左边,而不是 redim preserve left( total_size ) 然后将右边的值添加到它?
【解决方案2】:

我知道这个问题有点老了,但是你需要修复一些东西,以便你可以从两个数组中获取所有值。

您需要升级第二个 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

【讨论】:

  • 我很困惑这是一个问题还是一个答案?
  • 这不是 OP 代码的提议替代方案,它解决了问题吗?它声明了一个名为 array_merge 的函数,答案是“你需要做这样的事情来实现这样的事情”。我没有详细查看代码,但我不清楚为什么它甚至会被标记?也许如果我们用“你”代替“我们”,这就是一个答案会更清楚?
  • @GreenAsJade 感谢您注意到这是一个答案并对其进行了编辑,使其更清晰。很抱歉在查看标记的帖子时出现错误。
  • @GreenAsJade 堆栈 sn-p 的相关性如何?我们正在谈论“服务器端”脚本语言。
  • 我也想知道 sn-p - 但我现在才意识到,发帖人认为他们需要将代码放在 sn-p 中进行格式化 - 一堆 ASP 代码只是包装在 sn- p 标签而不是 {} 代码。
【解决方案3】:

对 Paolo Pta 的回答进行了小幅效率提升。无需遍历 arr1;只是“重新调整保留”它。

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

【讨论】:

    【解决方案4】:

    几年后,但也许有人可以使用它。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      相关资源
      最近更新 更多