Подтвердить что ты не робот

Добавить элемент в массив в VBScript

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

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

то есть.

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

  • ReDim Preserve
  • Словарь-объект, который может иметь строковые ключи и искать их
  • ArrayList.Net Framework Class, который имеет множество методов, включая: сортировать (вперед, назад, обычай), вставлять, удалять, binarysearch, equals, toArray и toString

С приведенным ниже кодом я обнаружил, что 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]

Ответ 3

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

' 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

Незначительное изменение в 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 миллионов попыток, очевидно, этот процент имеет прямую связь с количеством попыток)

Ответ 5

это какой-то поздний, но в любом случае, и это также несколько сложно.

 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' 

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

Ответ 6

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

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