2011-01-05 6 views
37

VBScript의 기존 배열에 항목을 어떻게 추가합니까?VBScript의 배열에 항목 추가

Javascript의 push 함수에 해당하는 VBScript가 있습니까?

myArray의 세 가지 항목에 "애플", "오렌지"및 "바나나"를 가지며, I는 배열의 마지막에 "박"를 추가 할.

답변

55

배열은 VBScript에서 매우 동적이지 않습니다. 이 추가 항목을 수용 할 수 있도록 기존의 배열을 성장하는 ReDim Preserve 문을 사용해야합니다 :

ReDim Preserve yourArray(UBound(yourArray) + 1) 
yourArray(UBound(yourArray)) = "Watermelons" 
+0

감사처럼 사용 용이성! – Choy

+6

'Redim Preserve'는 사용할 때마다 전체 배열을 복사한다는 것에주의하십시오. 즉, big-O 표기법에서 n ** 2 복잡도를가집니다. – mgr326639

+0

@user, 전체 배열을 복사하는 것은 2 차가 아닌 ('O (n²)') 선형 복잡성 ('O (n)')을 가지고 있습니다. –

9

사용자 지정 COM 또는 ActiveX 객체

  1. ReDim을 포함하지 않는 몇 가지 방법이 있습니다 문자열 키를 가질 수있는,
  2. 사전 개체를 보존하고
  3. ArrayList를 포함하는 많은 방법이있다 .NET Framework 클래스, 그들을 위해 검색 : 종류 (정, 역, 사용자 정의), 삽입, 제거를 binarysearch, 나는 ReDim을 가장 빠르게 54000 다음과 같습니다, 사전 54,000에서 690,000에 가장 빠른 보존 발견, 아래의 코드를 사용 toArray 및 toString

동일하고, 배열 목록 내가 사용하는 경향이 빠른 690000. 위입니다 정렬 및 배열 변환 때문에 푸시하기위한 ArrayList

user326639 제공되는 FastArray는 훨씬 빠릅니다.

사전은 값을 검색하고 색인 (예 : 필드 이름)을 반환하거나 그룹화 및 집계 (히스토그램, 그룹 및 추가, 문자열 그룹화 및 연결, 그룹 및 푸시 하위 배열)에 유용합니다. 키를 그룹화 할 때 case in/sensitivity에 대해 CompareMode를 설정하고 "add"하기 전에 "exists"속성을 확인하십시오.

Redim은 한 배열에 많은 시간을 절약하지 않지만 배열 사전에 유용합니다. 위에서 FastArray에

'pushtest.vbs 
imax = 10000 
value = "Testvalue" 
s = imax & " of """ & value & """" 

t0 = timer 'ArrayList Method 
Set o = CreateObject("System.Collections.ArrayList") 
For i = 0 To imax 
    o.Add value 
Next 
s = s & "[AList " & FormatNumber(timer - t0, 3, -1) & "]" 
Set o = Nothing 

t0 = timer 'ReDim Preserve Method 
a = array() 
For i = 0 To imax 
    ReDim Preserve a(UBound(a) + 1) 
    a(UBound(a)) = value 
Next 
s = s & "[ReDim " & FormatNumber(timer - t0, 3, -1) & "]" 
Set a = Nothing 

t0 = timer 'Dictionary Method 
Set o = CreateObject("Scripting.Dictionary") 
For i = 0 To imax 
    o.Add i, value 
Next 
s = s & "[Dictionary " & FormatNumber(timer - t0, 3, -1) & "]" 
Set o = Nothing 

t0 = timer 'Standard array 
Redim a(imax) 
For i = 0 To imax 
    a(i) = value 
Next 
s = s & "[Array " & FormatNumber(timer - t0, 3, -1) & "]" & vbCRLF 
Set a = Nothing 

t0 = timer 'Fast array 
a = array() 
For i = 0 To imax 
ub = UBound(a) 
If i>ub Then ReDim Preserve a(Int((ub+10)*1.1)) 
a(i) = value 
Next 
ReDim Preserve a(i-1) 
s = s & "[FastArr " & FormatNumber(timer - t0, 3, -1) & "]" 
Set a = Nothing 

MsgBox s 

' 10000 of "Testvalue" [ArrayList 0.156][Redim 0.016][Dictionary 0.031][Array 0.016][FastArr 0.016] 
' 54000 of "Testvalue" [ArrayList 0.734][Redim 0.672][Dictionary 0.203][Array 0.063][FastArr 0.109] 
' 240000 of "Testvalue" [ArrayList 3.172][Redim 5.891][Dictionary 1.453][Array 0.203][FastArr 0.484] 
' 690000 of "Testvalue" [ArrayList 9.078][Redim 44.785][Dictionary 8.750][Array 0.609][FastArr 1.406] 
'1000000 of "Testvalue" [ArrayList 13.191][Redim 92.863][Dictionary 18.047][Array 0.859][FastArr 2.031] 
+3

이 코드를 추가 할 것을 권장합니다. t0 = timer '패스트 배열 a = array() i = 0 인 경우 ub = UBound (a) i> ub이면 ReDim Preserve a (Int ((Timer-t0, 3, -1) & "]) a (i) = value ReDim Preserve a (i-1) s ="& "[FastArr"& FormatNumber " = Nothing을 설정하십시오 – mgr326639

+0

고마워요! 나는 결코 그 것을 생각할 수 없었을 것입니다. – Will

+0

@ mgr326639 'ReDim Preserve a (i-1)'의 마지막은 무엇입니까? – sirdank

3

약간의 변화 :의 매 사이클마다 UBound(a)을 확인 아무 소용이 없습니다

'pushtest.vbs 
imax = 10000000 
value = "Testvalue" 
s = imax & " of """ & value & """" 

t0 = timer 'Fast array 
a = array() 
ub = UBound(a) 
For i = 0 To imax 
If i>ub Then 
    ReDim Preserve a(Int((ub+10)*1.1)) 
    ub = UBound(a) 
End If 
a(i) = value 
Next 
ReDim Preserve a(i-1) 
s = s & "[FastArr " & FormatNumber(timer - t0, 3, -1) & "]" 

MsgBox s 

우리가 변경 정확히 알고있는 경우에. 그것은 단지 시작에 대한 후 매 시간이 ReDim이 이전 방법은 10 개 수백만의 아이 맥스 (IMAX)에 대한 7.52 초 걸렸 내 컴퓨터에서

을 호출되는 전에 UBound(a)을 수행 확인하도록

나는 그것을 변경했습니다.

새 메서드는 5를 사용했습니다.10 초당 성능 향상을 의미하는 10 초당 29 초 (1 천만 번의 시도에서 분명히이 비율은 시도 횟수와 직접적인 관계가 있음)

0

또한

dim arrr 
    arr= array ("Apples", "Oranges", "Bananas") 
dim temp_var 
temp_var = join (arr , "||") ' some character which will not occur is regular strings 
if len(temp_var) > 0 then 
    temp_var = temp_var&"||Watermelons" 
end if 
arr = split(temp_var , "||") ' here you got new elemet in array ' 
for each x in arr 
response.write(x & "<br />") 
next' 

검토 다소 까다 롭습니다 이것은 일을 할 수 있는지 말해 또는 처음에 당신이 배열

0

되지 않음 대답 또는 왜 'tricky에 대한 문자열을 나중에 분할의 모든 데이터를 저장 ' 나쁜 : 당신의 복사 및 붙여 넣기를 들어

>> a = Array(1) 
>> a = Split(Join(a, "||") & "||2", "||") 
>> WScript.Echo a(0) + a(1) 
>> 
12 
4

' add item to array 
Function AddItem(arr, val) 
    ReDim Preserve arr(UBound(arr) + 1) 
    arr(UBound(arr)) = val 
    AddItem = arr 
End Function 

이 도움을 그렇게

a = Array() 
a = AddItem(a, 5) 
a = AddItem(a, "foo")