asp模拟javascript数组对象ArrayList类
除了一个join方法(使用JoinBy代替)其它名称上基本和js相同,另外又添加了几个有用的方法
实际应用的效率尚未测试.
类代码(ArrayList.asp):
<%
'******************************
'类名:ArrayList
'日期:2012-1-9
'作者:shirne
'网址:http://www.shirne.com
'描述:模拟javascript中数组对象的
' 一些功能和其它相关功能
'版权:可在程序中自由使用但请注明出处,作者
'******************************
Class ArrayList
Private arrList() '内部数组
Private Sub Class_Initialize()
'ReDim arrList(0)
End Sub
Private Sub Class_Terminate()
Erase arrList
End Sub
'数组长度,读取
Public Property Get Length
On Error Resume Next
Length=UBound(arrList)+1
If Err Then Err.Clear:Length=0
On Error GoTo 0
End Property
'数组长度,设定,小于1将清空数组
Public Property Let Length( L)
If L<1 Then
Erase arrList
Else
ReDim Preserve arrList(L-1)
End If
End Property
'取得某个索引的值,索引小于0将倒序取,大于长度返回Empty
Public Default Property Get Value(idx)
Dim L
L=Length
If L<1 Then
Value=Empty
ElseIf idx<0 Then
idx=L-(Abs(idx) Mod L)
Value=arrList(idx)
ElseIf idx>=L Then
Value=Empty
Else
Value=arrList(idx)
End If
End Property
Public Property Let Value(idx, val)
If idx>=Length Then
ReDim Preserve arrList(idx)
End If
arrList(idx)=val
End Property
'返回整个Array数组
Public Property Get Array()
Array=arrList
End Property
'添加元素
Public Sub Push(v)
Dim L
L=Length
ReDim Preserve arrList(L)
arrList(L)=v
End Sub
'将元素插入ArrayList的指定索引处,原有位置及后面的元素都往后排,如果索引超出,将插入到最后
Public Sub Insert(idx,v)
Dim I, v2, L
L=Length
If idx<L And idx>=0 Then
ReDim Preserve arrList(L)
For I = idx To L
v2=arrList(I)
arrList(I)=v
v=v2
Next
Else
Value(L)=v
End If
End Sub
'连接一个新的数组到最后
Public Sub Concat(arr)
If Not IsArray(arr) Then showErr "参数不是数组(arr):ArrayList.Concat()":Exit Sub
Dim I, nL, J, L
L=Length
If L = 0 Then
arrList=arr
Else
nL=L+UBound(arr)
J=0
ReDim Preserve arrList(nL)
For I = L To nL
arrList(I)=arr(J)
J=J+1
Next
End If
End Sub
'将一组数组插入到指定的索引处,索引大于数组长度,将插入到最后
Public Sub InsertArray(idx,arr)
If idx = "" Or Not IsNumeric(idx) Then
showErr "非法的参数:ArrayList.InsertArray()":Exit Sub
End If
If Not IsArray(arr) Then
showErr "参数不是数组:ArrayList.InsertArray()":Exit Sub
End If
Dim I, L1, L2, J, L
L=Length
J=0
If L<1 Or idx>L Then
Concat arr
Else
L1=UBound(arr)
L2=L+L1
ReDim Preserve arrList(L2)
For I = l -1 To idx Step -1
arrList(I+L1+1)=arrList(I)
Next
For I = idx To idx+L1
arrList(I)=arr(J)
J=J+1
Next
End If
End Sub
'从ArrayList中删除第一个匹配项
Public Sub Remove(v)
Dim I,idx, L
L=Length-1
idx = -1
For I = 0 To L
If arrList(I)=v Then idx = I : Exit For
Next
If idx <> -1 Then
For I = idx To L-1
arrList(I) = arrList(I+1)
Next
ReDim Preserve arrList(L-1)
End If
End Sub
'移除ArrayList的指定索引处的元素,并返回该元素
Public Function RemoveAt(idx)
If idx <> "" And IsNumeric(idx) Then
Dim L
L=Length-1
If idx >= 0 And idx<=L Then
RemoveAt=arrList(idx)
For I = idx To L-1
arrList(I) = arrList(I+1)
Next
ReDim Preserve arrList(L-1)
End If
End If
End Function
'从一个数组中移除从索引m到索引n的一段元素,并返回这段移除的数组
Public Function Splice(m,n)
If m = "" Or n = "" Or Not IsNumeric(m) Or Not IsNumeric(n) Then
showErr "非法的参数(m,n):ArrayList.Splice()":Exit Function
End If
Dim newArr(), x, L, I, J, B
L=Length-1
If m > n Then x=m:m=n:n=x
m=Min(L-1,m)
n=Min(L-1,n)
B=n-m
J=0
ReDim newArr(B)
For I = m To n
newArr(J)=arrList(I)
J=J+1
Next
For I = m To L-B-1
arrList(I)=arrList(I+B+1)
Next
ReDim Preserve arrList(L-B-1)
Splice=newArr
End Function
'清空数组,数组将变为空,效果与设定Length小于1相同
Public Sub Clear()
Erase arrList
End Sub
'反转数组
Public Sub Reverse()
Dim L, I, J, v, H
L=Length
J=L-1
If L > 0 Then
H=Int(L/2)
For I = 0 To H-1
v=arrList(I)
arrList(I)=arrList(J)
arrList(J)=v
J=J-1
Next
End If
End Sub
'使用指定字符连接数组的值
Public Function JoinBy(separator)
JoinBy=Join(arrList,separator)
End Function
'返回ArrayList从m到n的一段数组
Public Function Slice(m,n)
If m = "" Or n = "" Or Not IsNumeric(m) Or Not IsNumeric(n) Then
showErr "非法的参数:ArrayList.Slice()":Exit Function
End If
Dim I, J, K, newArr(), L
L=Length
J=0
If L<1 Then Slice=Split("",""):Exit Function
If m < 0 Then m=0
If n < 0 Then n=0
K=Min(Max(m,n),L-1)
ReDim newArr(Abs(m-n))
For I=Min(m, n) To K
newArr(J)=arrList(I)
J=J+1
Next
Slice=newArr
Erase newArr
End Function
'查找值,返回ArrayList第一个匹配项的从零开始的索引。没找到返回-1。
Public Function IndexOf(v)
Dim I
For I = 0 To Length - 1
If arrList(I)=v Then IndexOf=I:Exit Function
Next
IndexOf=-1
End Function
'反向查找,返回ArrayList的最后一个匹配项的从零开始的索引。没找到返回-1。
Public Function LastIndexOf(v)
Dim I, L
L=Length
LastIndexOf=-1
If L>0 Then
For I = (L-1) To 0 Step -1
If arrList(I)=v Then LastIndexOf=I:Exit Function
Next
End If
End Function
'显示错误
Private Sub showErr(errInfo)
Response.Write errInfo
Response.Write "<br />"
If Err Then
Response.Write Err.Number
Response.Write ":"
Response.Write Err.Description
Response.Write "<br />"
End If
Response.End()
End Sub
End Class
%>
演示代码(ArrayListTest.asp):
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<!--#include file="ArrayList.asp"-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>数据操作类测试</title>
</head>
<body>
<%
Dim arr
Set arr=New ArrayList
Response.Write "---创建新数组<br>"
Response.Write "arr.length:"&arr.length &"<br>"
Response.Write "<br>---添加元素,直接赋值,push方法<br>"
arr(0)="第一个元素"
arr(1)="A"
arr(2)="B"
arr(4)="C"
arr(6)="D"
arr(7)="E"
arr(8)="第九个元素"
arr.push("第十个元素")
Response.Write "arr.length:"&arr.length &"<br>"
Response.Write "arr(0):"&arr(0) &"<br>"
Response.Write "arr(12):"&arr(12) &"<br>"
Response.Write "arr.JoinBy:"&arr.JoinBy(", ") &"<br>"
Response.Write "<br>---连接数组<br>"
arr.Concat(Array("a","b","c","d","e"))
Response.Write "arr.length:"&arr.length &"<br>"
Response.Write "arr(12):"&arr(12) &"<br>"
Response.Write "arr.JoinBy:"&arr.JoinBy(", ") &"<br>"
Response.Write "<br>---remove<br>"
arr.Remove("a")
Response.Write "arr.length:"&arr.length &"<br>"
Response.Write "arr(12):"&arr(12) &"<br>"
Response.Write "arr.JoinBy:"&arr.JoinBy(", ") &"<br>"
Response.Write "<br>---removeat<br>"
arr.RemoveAt(10)
Response.Write "arr.length:"&arr.length &"<br>"
Response.Write "arr(12):"&arr(12) &"<br>"
Response.Write "arr.JoinBy:"&arr.JoinBy(", ") &"<br>"
Response.Write "<br>---Insert<br>"
arr.Insert 10,"xxx"
Response.Write "arr.length:"&arr.length &"<br>"
Response.Write "arr(12):"&arr(12) &"<br>"
Response.Write "arr.JoinBy:"&arr.JoinBy(", ") &"<br>"
Response.Write "<br>---InsertArray<br>"
arr.InsertArray 10,Array("yyy","zzz")
Response.Write "arr.length:"&arr.length &"<br>"
Response.Write "arr(12):"&arr(12) &"<br>"
Response.Write "arr.JoinBy:"&arr.JoinBy(", ") &"<br>"
Response.Write "<br>---Reverse<br>"
arr.Reverse()
Response.Write "arr.length:"&arr.length &"<br>"
Response.Write "arr(12):"&arr(12) &"<br>"
Response.Write "arr.JoinBy:"&arr.JoinBy(", ") &"<br>"
Response.Write "<br>---IndexOf<br>"
Response.Write "IndexOf(""xxx""):"&arr.IndexOf("xxx") &"<br>"
Response.Write "arr(12):"&arr(12) &"<br>"
Response.Write "arr.JoinBy:"&arr.JoinBy(", ") &"<br>"
Response.Write "<br>---LastIndexOf<br>"
Response.Write "LastIndexOf(""xxx""):"&arr.IndexOf("xxx") &"<br>"
Response.Write "arr(12):"&arr(12) &"<br>"
Response.Write "arr.JoinBy:"&arr.JoinBy(", ") &"<br>"
Response.Write "<br>---Slice(8,12)<br>"
newarr=arr.Slice(8,12)
Response.Write "Slice Array:"& Join(newarr,", ") &"<br>"
Response.Write "arr.length:"&arr.length &"<br>"
Response.Write "arr(12):"&arr(12) &"<br>"
Response.Write "arr.JoinBy:"&arr.JoinBy(", ") &"<br>"
Response.Write "<br>---Splice(8,12)<br>"
newarr=arr.Splice(8,12)
Response.Write "splice Array:"& Join(newarr,", ") &"<br>"
Response.Write "arr.length:"&arr.length &"<br>"
Response.Write "arr(12):"&arr(12) &"<br>"
Response.Write "arr.JoinBy:"&arr.JoinBy(", ") &"<br>"
Function Max(a, b)
If a>b Then
Max=a
Else
Max=b
End If
End Function
Function Min(a, b)
If a<b Then
Min=a
Else
Min=b
End If
End Function
%>
</body>
</html>