it-swarm.com.de

Element zu Array in VBScript hinzufügen

Wie fügen Sie einem vorhandenen Array in VBScript ein Element hinzu?

Gibt es ein VBScript, das der Push-Funktion in Javascript entspricht?

d.h.

myArray enthält drei Elemente, "Äpfel", "Orangen" und "Bananen". Ich möchte am Ende des Arrays "Wassermelonen" hinzufügen.

41
Choy

Arrays sind in VBScript nicht sehr dynamisch. Sie müssen die Anweisung ReDim Preserve verwenden, um das vorhandene Array so zu vergrößern, dass ein zusätzliches Element aufgenommen werden kann:

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

Es gibt verschiedene Möglichkeiten, ein benutzerdefiniertes COM- oder ActiveX-Objekt nicht einzuschließen

  1. ReDim Preserve
  2. Wörterbuchobjekt, das über String-Schlüssel verfügen und danach suchen kann
  3. ArrayList .Net Framework-Klasse, die viele Methoden enthält, darunter: Sortieren (vorwärts, rückwärts, benutzerdefiniert), insert, remove, Binarysearch, equals, toArray und toString

Mit dem folgenden Code habe ich festgestellt, dass Redim Preserve unter 54000 am schnellsten ist, Dictionary zwischen 54000 und 690000 am schnellsten ist und Array List über 690000 am schnellsten ist.

user326639 lieferte FastArray, was ziemlich schnell ist.

Wörterbücher sind nützlich für die Suche nach dem Wert und die Rückgabe des Index (d. H. Feldnamen) oder für die Gruppierung und Aggregation (Histogramme, Gruppieren und Hinzufügen, Gruppieren und Verketten von Zeichenfolgen, Gruppen- und Push-Subarrays). Setzen Sie beim Gruppieren nach Schlüsseln CompareMode für Groß-/Kleinschreibung in/sensitive und überprüfen Sie die Eigenschaft "exists" vor dem "add" -Eingriff.

Redim würde nicht viel Zeit für ein Array sparen, aber es ist nützlich für ein Array von Arrays.

'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]
10
Will

Für Ihr Kopieren und Einfügen

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

So benutzt

a = Array()
a = AddItem(a, 5)
a = AddItem(a, "foo")
8
Charles Clayton

Leichte Änderung des FastArray von oben:

'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

Es hat keinen Sinn, UBound(a) in jedem Zyklus des zu überprüfen, ob wir genau wissen, wann sich das ändert.

Ich habe es so geändert, dass es überprüft, ob UBound(a) kurz vor dem for-Start und dann nur bei jedem Aufruf der ReDim ausgeführt wird

Auf meinem Computer dauerte die alte Methode 7,52 Sekunden für einen Imax von 10 Millionen.

Die neue Methode benötigte 5,29 Sekunden für einen Imax von 10 Millionen, was eine Leistungssteigerung von über 20% bedeutet (für 10 Millionen Versuche hat dieser Prozentsatz offensichtlich einen direkten Bezug zur Anzahl der Versuche)

4
cog

Basierend auf Charles Claytons Antwort , jedoch etwas vereinfacht ...

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

So benutzt

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

Keine Antwort oder Warum ' tricky ' ist schlecht:

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

das ist irgendwie spät aber trotzdem und es ist auch etwas knifflig 

 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' 

Überprüfen Sie und sagen Sie mir, ob dies funktionieren kann Sie speichern zunächst alle Daten in Zeichenfolge und teilen sie später für das Array auf 

0
ddw147