web-dev-qa-db-ja.com

VBScriptの配列にアイテムを追加する

VBScriptの既存の配列にアイテムを追加するにはどうすればよいですか?

JavaScriptのプッシュ関数に相当するVBScriptはありますか?

つまり.

myArrayには「Apples」、「Oranges」、および「Bananas」の3つの項目があり、配列の最後に「Watermelons」を追加します。

43
Choy

VBScriptでは配列はあまり動的ではありません。 ReDim Preserve ステートメントを使用して既存の配列を拡大し、追加のアイテムを収容できるようにする必要があります。

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

いくつかの方法がありますが、カスタムCOMまたはActiveXオブジェクトは含まれません

  1. ReDim Preserve
  2. 文字列キーを持ち、それらを検索できる辞書オブジェクト
  3. ArrayList .Net Frameworkクラス。これには、次のような多くのメソッドがあります。sort(forward、reverse、custom)、insert、remove、binarysearch、equals、toArray、toString

以下のコードでは、Redim Preserveは54000未満で最も速く、辞書は54000〜690000で最も速く、Array Listは690000以上で最も速いことがわかりました。ソートと配列変換のため、ArrayListを使用してプッシュする傾向があります。

user326639はFastArrayを提供しましたが、これはほとんど最速です。

辞書は、値を検索してインデックスを返す(つまり、フィールド名)か、グループ化と集計(ヒストグラム、グループ化と追加、文字列、グループ化、プッシュサブ配列のグループ化と連結)に役立ちます。キーでグループ化する場合、大文字と小文字の区別/大文字と小文字を区別するためにCompareModeを設定し、「追加」する前に「存在する」プロパティを確認します。

Redimは1つの配列の時間をあまり節約しませんが、配列の辞書には役立ちます。

'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

コピー&ペーストを簡単に

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

上からFastArrayへのわずかな変更:

_'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
_

Forの各サイクルでUBound(a)をチェックしても意味がありません。

For開始の直前にUBound(a)を実行し、ReDimが呼び出されるたびにチェックするように変更しました

私のコンピューターでは、imaxが1,000万の場合、古い方法では7.52秒かかりました。

新しい方法ではimaxが1,000万件で5.29秒かかりました。これは、パフォーマンスが20%以上向上することを意味します(1000万回の試行では、明らかにこの割合は試行回数に直接関係します)

4
cog

Charles Clayton's answer に基づいていますが、わずかに簡略化されています...

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

そのように使用

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

答えではないまたはなぜ ' tricky 'が悪い

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

これはある種の遅いですが、とにかく、それはまたややトリッキーです

 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
ddw147