Добавить элемент в массив в VBScript - PullRequest
41 голосов
/ 05 января 2011

Как добавить элемент в существующий массив в VBScript?

Есть ли VBScript, эквивалентный функции push в Javascript?

т.е.items, «Яблоки», «Апельсины» и «Бананы», и я хочу добавить «Арбузы» в конец массива.

Ответы [ 7 ]

60 голосов
/ 05 января 2011

Массивы не очень динамичны в VBScript. Вам придется использовать оператор ReDim Preserve , чтобы увеличить существующий массив, чтобы он мог вместить дополнительный элемент:

ReDim Preserve yourArray(UBound(yourArray) + 1)
yourArray(UBound(yourArray)) = "Watermelons"
10 голосов
/ 10 мая 2012

Есть несколько способов, не включая пользовательский объект COM или ActiveX

  1. ReDim Preserve
  2. Словарь, который может иметь строковые ключи и искать их
  3. ArrayList .Net Framework Class, который имеет много методов, включая: sort (forward, reverse, custom), вставка, удаление, binarysearch, equals, toArray и toString

С кодомниже я обнаружил, что Redim Preserve быстрее 54000, Dictionary быстрее всего с 54000 до 690000, а список Array List быстрее 690000. Я склонен использовать ArrayList для отправки из-за сортировки и преобразования массива.

user326639 предоставил FastArray, который является довольно быстрым.

Словари полезны для поиска значения и возврата индекса (т. е. имен полей) или для группировки и агрегирования (гистограммы, группировать и добавлять, группировать иобъединять строки, группировать и выдвигать вложенные массивы).При группировке по ключам установите CompareMode для регистра / чувствительности и проверьте свойство «exist» перед «add» -ing.

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]
9 голосов
/ 23 июля 2016

Для удобства копирования и вставки

' 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")
4 голосов
/ 05 сентября 2013

Небольшое изменение на 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

Нет смысла проверять UBound(a) в каждом цикле for, если мы точно знаем, когда он меняется.

IЯ изменил его так, что он проверяет UBound(a) непосредственно перед запуском for, а затем только каждый раз, когда ReDim вызывается

. На моем компьютере старый метод занимал 7,52 секунды для imax из 10 миллионов.

Новый метод потребовал 5,29 секунды для imax также с 10 миллионами, что означает увеличение производительности более чем на 20% (для 10 миллионов попыток, очевидно, этот процент имеет прямое отношение к количеству попыток)

0 голосов
/ 26 октября 2018

На основании ответа Чарльза Клейтона , но слегка упрощенного ...

' 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 голосов
/ 07 мая 2014

Не ответ Или Почему ' хитро ' плохо :

>> a = Array(1)
>> a = Split(Join(a, "||") & "||2", "||")
>> WScript.Echo a(0) + a(1)
>>
12
0 голосов
/ 07 мая 2014

это как-то поздно, но в любом случае, и это тоже немного хитро

 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' 

просмотрите и скажите, может ли это сработать или сначала вы сохраняете все данные в строку, а затем разделяете для массива

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...