Comment ajouter un élément à un tableau existant dans VBScript?
Existe-t-il un équivalent de VBScript à la fonction Push en Javascript?
c'est à dire.
myArray a trois éléments, "Pommes", "Oranges" et "Bananes" et je souhaite ajouter "Pastèques" à la fin du tableau.
Les tableaux ne sont pas très dynamiques dans VBScript. Vous devrez utiliser l'instruction ReDim Preserve pour agrandir le tableau existant afin qu'il puisse contenir un élément supplémentaire:
ReDim Preserve yourArray(UBound(yourArray) + 1)
yourArray(UBound(yourArray)) = "Watermelons"
Il y a plusieurs façons, sans inclure un objet COM ou ActiveX personnalisé
Avec le code ci-dessous, Redim Preserve est le plus rapide en dessous de 54000, Dictionary est le plus rapide, de 54000 à 690000, et Array List est le plus rapide au-dessus de 690000. J'ai tendance à utiliser ArrayList pour pousser en raison du tri et de la conversion des tableaux.
user326639 a fourni FastArray, qui est à peu près le plus rapide.
Les dictionnaires sont utiles pour rechercher la valeur et renvoyer l'index (c'est-à-dire les noms de champs), ou pour grouper et agréger (histogrammes, grouper et ajouter, grouper et concaténer des chaînes, des sous-tableaux Push et Push). Lors du regroupement sur des clés, définissez CompareMode pour la casse/sensibilité et vérifiez la propriété "existe" avant la propriété "add".
Redim ne permettrait pas de gagner beaucoup de temps pour un tableau, mais c'est utile pour un dictionnaire de tableaux.
'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]
Pour votre facilité de copier/coller
' add item to array
Function AddItem(arr, val)
ReDim Preserve arr(UBound(arr) + 1)
arr(UBound(arr)) = val
AddItem = arr
End Function
Utilisé comme tel
a = Array()
a = AddItem(a, 5)
a = AddItem(a, "foo")
Légère modification du FastArray par le haut:
'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
Il est inutile de vérifier UBound(a)
à chaque cycle de si nous savons exactement quand cela change.
Je l'ai changé pour qu'il vérifie que UBound(a)
se trouve juste avant le début du for, puis seulement à chaque appel de la ReDim
Sur mon ordinateur, l'ancienne méthode prenait 7,52 secondes pour un imax de 10 millions.
La nouvelle méthode a pris 5,29 secondes pour un imax de 10 millions également, ce qui représente une augmentation des performances de plus de 20% (pour 10 millions d'essais, ce pourcentage est évidemment en relation directe avec le nombre d'essais)
Basé sur la réponse de Charles Clayton , mais légèrement simplifiée ...
' add item to array
Sub ArrayAdd(arr, val)
ReDim Preserve arr(UBound(arr) + 1)
arr(UBound(arr)) = val
End Sub
Utilisé comme tel
a = Array()
AddItem(a, 5)
AddItem(a, "foo")
Pas une réponse Ou Pourquoi ' difficile ' est mauvais:
>> a = Array(1)
>> a = Split(Join(a, "||") & "||2", "||")
>> WScript.Echo a(0) + a(1)
>>
12
cela en quelque sorte en retard mais de toute façon et il est aussi un peu difficile
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'
examinez-moi et dites-moi si cela peut fonctionner .__ ou si vous enregistrez initialement toutes les données dans une chaîne et que vous les divisez par la suite