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)
展示在 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 方法的伸缩性更好。
在数组上使用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