web-dev-qa-db-fra.com

Ajouter un élément à un tableau dans VBScript

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.

41
Choy

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"
60
Frédéric Hamidi

Il y a plusieurs façons, sans inclure un objet COM ou ActiveX personnalisé

  1. ReDim Preserve
  2. Objet dictionnaire, qui peut avoir des clés de chaîne et les rechercher
  3. ArrayList .Net Framework Class, qui comporte de nombreuses méthodes, notamment: Sort (avant, inverse, personnalisé), insérer, supprimer, Binarysearch, equals, toArray et toString

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

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")
8
Charles Clayton

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)

4
cog

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")
0
EamonnM

Pas une réponse Ou Pourquoi ' difficile ' est mauvais:

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

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 

0
ddw147