Как добавить элемент в существующий массив в VBScript?
Есть ли эквивалент VBScript функции push в Javascript?
то есть.
myArray имеет три элемента: "Яблоки", "Апельсины" и "Бананы", и я хочу добавить "Арбузы" в конец массива.
Как добавить элемент в существующий массив в VBScript?
Есть ли эквивалент VBScript функции push в Javascript?
то есть.
myArray имеет три элемента: "Яблоки", "Апельсины" и "Бананы", и я хочу добавить "Арбузы" в конец массива.
Массивы не очень динамичны в VBScript. Вам нужно будет использовать оператор ReDim Preserve для увеличения существующего массива, чтобы он мог разместить дополнительный элемент:
ReDim Preserve yourArray(UBound(yourArray) + 1)
yourArray(UBound(yourArray)) = "Watermelons"
Существует несколько способов, не включая пользовательский объект COM или ActiveX
С приведенным ниже кодом я обнаружил, что Redim Preserve быстрее всего ниже 54000, словарь быстрее всех - от 54000 до 690000, а массив Array List - выше 690000. Я склонен использовать ArrayList для нажатия из-за сортировки и преобразования массивов.дел >
user326639 предоставил FastArray, что является самым быстрым.
Словари полезны для поиска значения и возврата индекса (например, имена полей) или для группировки и агрегации (гистограммы, группировки и добавления, группировки и конкатенации строк, групповых и push-подматриц). При группировке по клавишам установите CompareMode для случая/чувствительности и проверьте свойство "существует" перед "добавлением".
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]
Для удобства копирования и вставки
' 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")
Незначительное изменение в 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, если мы точно знаем, когда он изменяется.
Я изменил его так, чтобы он проверял UBound(a)
непосредственно перед запуском for, а затем только каждый раз, когда ReDim
вызывается
На моем компьютере старый метод взял 7.52 секунды для imax 10 миллионов.
Новый метод потребовал 5,29 секунды для imax также 10 миллионов, что означает увеличение производительности более чем на 20% (для 10 миллионов попыток, очевидно, этот процент имеет прямую связь с количеством попыток)
это какой-то поздний, но в любом случае, и это также несколько сложно.
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'
просмотрите и скажите, может ли это работать или сначала вы сохраняете все данные в строке, а затем разбиваете на массив
Не ответ или Почему хитрое" плохо:
>> a = Array(1)
>> a = Split(Join(a, "||") & "||2", "||")
>> WScript.Echo a(0) + a(1)
>>
12