2017-02-13 30 views
0

Я пересматриваю свой код и пытаюсь сократить повторение. У меня это рабочий кодКак проверить, является ли переменная в массиве в vbscript

<% If tree <> "" or (info <> "" and info <> "links" and info <> "privacy" and info <> "talks") Then %> 
      write stuff 
<% End If %> 

Я поставил Информация переменные в массив

Dim info(3) 
info(0) = "Talks" 
info(1) = "Privacy" 
info(2) = "Links" 

Я нахожусь неясно, перебирать массив

<% If tree <> "" or (info <> "" and **info <> arrayInfo** Then %> 
      write stuff 
<% End If %> 

Маленькая помощь. Благодарю.

ответ

5

Вам нужен словарь, если вы хотите использовать один выражения (.Exists), чтобы получить факт (содержащийся или нет) о всех элементов коллекции. Посмотрите:

Option Explicit 

Dim aInfo(2) ' last index; not size 
aInfo(0) = "Talks" 
aInfo(1) = "Privacy" 
aInfo(2) = "Links" 
Dim dicInfo : Set dicInfo = CreateObject("Scripting.Dictionary") 
dicInfo.CompareMode = vbTextCompare 
Dim i 
For Each i In aInfo 
    dicInfo(i) = 0 
Next 
For Each i In Split("Talks Other Links Else") 
    If dicInfo.Exists(i) Then 
     WScript.Echo i, "found" 
    Else 
     WScript.Echo "no", i, "in", Join(dicInfo.Keys()) 
    End If 
Next 

выход:

cscript 42207316.vbs 
Talks found 
no Other in Talks Privacy Links 
Links found 
no Else in Talks Privacy Links 
2

Другой метод заключается в создании строки и инстр().

InStr ([старт,] строка1, строка2 [сравните]) Если строка2 не найден в string1 затем InStr возвращает 0.

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

<% 
dim sText 
sText="|Talks|Privacy|Links|" 

    If tree <> "" or (len(info) > 0 and instr(1, sText, "|" info & "|")) Then %> 
      write stuff 
<% End If %> 

Этот метод стоит нескольких строк для проверки. Режим сравнения по умолчанию чувствителен к регистру, но вы можете сделать его нечувствительным.

Для получения более подробной информации см. http://www.w3schools.com/asp/func_instr.asp.

Это менее пуристский, чем словарь, но стоит знать.

2

Хотя я согласен с приведенным выше ответом, используя функцию Instr, есть альтернатива. Ваш вопрос спрашивает, как итерации через массив, чтобы проверить значения. Используйте цикл For..Next. Пример кода ниже.

dim arrInfo(2) 
dim blnInfoGood 

blnInfoGood = true 

arrInfo(0) = "Talks" 
arrInfo(1) = "Privacy" 
arrInfo(2) = "Links" 

for k = lbound(arrInfo) to ubound(arrInfo) 
    if info = arrInfo(k) then 
     blnInfoGood = false 
     exit for 
    end if 
next 

if tree <> "" or blnInfoGood then 
    ' Write stuff 
end if 

Надеюсь, это поможет.

1

Используйте словарь и используйте более простой условный.

<% 
set obj = server.createObject("scripting.dictionary") 

obj.add "links", "links" 
obj.add "privacy", "privacy" 
obj.add "talks", "talks" 

if tree <> "" and obj.exists(info)=false then 
    'write stuff 
end if 

set obj = nothing 
%> 
0

Вот простейший способ перебора массива, так как вы спросили об этом конкретно.

Dim info(3) 
    info(0) = "Talks" 
    info(1) = "Privacy" 
    info(2) = "Links" 

    for i = 0 to 2 
     if tree = info(i) then 
      'do stuff here with match 
     end if 
    next 
+0

Bad версия @ StackHound25 Ответим (неправильно UBound, нет выхода) –

+0

@ Ekkehard.Horner Simpler версия ответа Stackhound и не неправильно UBound. Массив коснется индексов 0, 1 и 2. Хотя значение UBound может быть здесь 3, это не то, как будет записан цикл. Я намеренно не использую UBound, когда размер массива известен и исправлен, личное предпочтение, я думаю. И выход падает под «делайте здесь». Я думал, это будет очевидно. Почему так много людей так быстро спускаются сюда? – Daniel

+0

Потому что многие люди публикуют низкокачественный код и находят хромые извинения за свои промахи («личное предпочтение», как можно «выйти», возможно, подпадают под «делать что-нибудь здесь со спичкой»?) –