6

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

这就是我想做的:创建一个带有标题和链接变量的 url_Link 对象,分别保存显示名称和 url。创建一个 url_Link 对象数组,并将其填充到页面的 .asp 文件顶部。对这些数组执行 for each 循环以构建和填充表

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

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

我能做些什么来解决这些问题?我对 vbscript 不是很了解,而且我一直在使用的大多数代码都没有利用数组或对象。

更新:我尝试使用 redim PRESERVE 来修剪超大数组的多余脂肪。问题是,在某些情况下,由于 if 条件,我的数组填充的对象数量少于其最大大小。当我使用 for 循环(试图让 for each 工作而目前没有发生)时,这会导致问题。我在 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)
4

2 回答 2

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)

输出:

Subscript out of range - caused by Dim c()
Subscript out of range - caused by Dim c()
a: 0 1
b: 0 1

更新 wrt 评论:

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

如果你看一下这个关于二维数组的问题,你可能会得出结论,a 方式的扩展性更好。

于 2013-07-27T07:17:22.027 回答
5

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

ReDim Preserve myArrayName (UBound(myArrayName) + 1)

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

于 2013-07-26T16:45:37.410 回答