在VBScript中将项添加到数组

时间:2011-01-05 14:40:28

标签: arrays vbscript

如何在VBScript中将项添加到现有数组?

是否有一个VBScript等同于Javascript中的push函数?

myArray有三个项目,“苹果”,“橘子”和“香蕉”,我想在阵列的末尾添加“西瓜”。

7 个答案:

答案 0 :(得分:60)

在VBScript中,数组不是很动态。您必须使用ReDim Preserve语句来扩展现有数组,以便它可以容纳额外的项目:

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

答案 1 :(得分:10)

有几种方法,不包括自定义COM或ActiveX对象

  1. ReDim Preserve
  2. 字典对象,可以有字符串键并搜索它们
  3. ArrayList .Net Framework类,有很多方法,包括: 排序(正向,反向,自定义),插入,删除, binarysearch,equals,toArray和toString
  4. 通过下面的代码,我发现Redim Preserve最快54000以下,Dictionary最快从54000到690000,Array List最快超过690000.由于排序和数组转换,我倾向于使用ArrayList进行推送

    user326639提供了FastArray,这是最快的。

    字典对于搜索值和返回索引(即字段名称),或用于分组和聚合(直方图,组和添加,组和连接字符串,组和推送子数组)非常有用。在对键进行分组时,为case in / sensitivity设置CompareMode,并在“add”-ing之前检查“exists”属性。

    Redim不会为一个数组节省太多时间,但它对数组字典很有用。

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

答案 2 :(得分:9)

为您的复制和粘贴轻松

' 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")

答案 3 :(得分:4)

从上面稍微改变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时检查

在我的计算机上,旧方法需要7.52秒才能获得1000万像素。

新方法花费5.29秒,同时也是1000万的imax,这意味着性能提升超过20%(对于1000万次尝试,显然这个百分比与尝试次数有直接关系)

答案 4 :(得分: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' 

检查并告诉我这是否可行 或者最初将所有数据保存在字符串中,然后将其拆分为数组

答案 5 :(得分:0)

不是答案为什么“tricky”不好

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

答案 6 :(得分:0)

基于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")