如何在vbscript中实现一个可变大小的数组

Mar*_*rus 6 arrays vbscript asp-classic

我正在重新设计网页的一部分,以便将来更容易更新.目前,它是一系列硬编码的表.要重新设计表格(例如,按照我想要的方式按字母顺序排列),需要手动交换html中的很多值.

这就是我想要做的:创建一个带有title和link变量的url_Link对象,分别保存显示名称和url.创建一个url_Link对象数组,并将其填充到页面的.asp文件的顶部.对这些阵列上的每个循环执行a以构建和填充表

这本身并不是那么糟糕,但我遇到了两个问题.首先,我不想定义数组大小,因为当对链接数进行更改时,这需要更改第二个位置.将存在一些逻辑来阻止显示某些url_Link对象(例如,某些用户无法访问某些页面,因此他们将看不到链接),这会在调整数组大小时引起问题.

我知道我可以制作一个大尺寸的数组,但这对我来说似乎很浪费(我不知道每个函数如何,也不希望出现一堆空行).

我该怎么做才能解决这些问题?我对vbscript知之甚少,而且我一直在使用的大部分代码都没有利用数组或对象.

更新:我尝试使用redim PRESERVE来修剪超大阵列的多余脂肪.问题是在某些情况下,由于if条件,我的数组中填充的对象数量少于其最大大小.当我使用for循环时,这会导致问题(尝试为每个循环工作并且目前没有发生).我在redim行上收到错误"此数组已固定或暂时锁定"

码:

  dim systemSettingsArray(1) 
  arrayCounter = 0
  if ADMIN = "Y" then
      set systemSettingsArray(arrayCounter) = (new url_Link).Init("Account Administration","Maintenance/Account_Admin.asp")
      arrayCounter = arrayCounter + 1
  end if
  set systemSettingsArray(arrayCounter) = (new url_Link).Init("Time Approval","Maintenance/system_Time_Approval.asp")
  redim Preserve systemSettingsArray(arrayCounter)
Run Code Online (Sandbox Code Playgroud)

Ekk*_*ner 6

展示在 VBScript 中使用动态数组的正确方法并证明 Matt 的评论是错误的:

Option Explicit

ReDim a(-1)
Dim b : b = Array()
Dim c()
Dim i
For i = 0 To 1
    ReDim Preserve a(UBound(a) + 1) : a(UBound(a)) = i
    ReDim Preserve b(UBound(b) + 1) : b(UBound(b)) = i
   On Error Resume Next
    ReDim Preserve c(UBound(c) + 1) : c(UBound(c)) = i
    WScript.Echo Err.Description, "- caused by Dim c()"
   On Error GoTo 0
Next
WScript.Echo "a:", Join(a)
WScript.Echo "b:", Join(b)
Run Code Online (Sandbox Code Playgroud)

输出:

Subscript out of range - caused by Dim c()
Subscript out of range - caused by Dim c()
a: 0 1
b: 0 1
Run Code Online (Sandbox Code Playgroud)

更新wrt评论:

a 和 b 方式都是正确的——你得到一个一维动态数组,从一开始就可以应用 UBound() 。有些人可能更喜欢 b,因为他们不喜欢ReDim v没有以前的Dim v;其他人可能会觉得 b 很笨拙或容易出错。

如果您查看有关二维数组的这个问题,您可能会得出结论,a 方法的伸缩性更好。


Mat*_*ide 5

在数组上使用redim preserve.您可以使用UBound查找当前的元素数量并执行类似的操作

ReDim Preserve myArrayName (UBound(myArrayName) + 1)
Run Code Online (Sandbox Code Playgroud)

http://msdn.microsoft.com/en-us/library/c850dt17%28v=vs.84%29.aspx

  • Marshall:当您最初调暗数组变量时,请确保数组括号为空.检查我发布的链接中的备注部分,他们随便提到它,但这有点大不了.你需要用空的parens调暗它,然后立即重新调整它. (3认同)