2017-02-13 8 views
0

私のコードをリファクタリングして繰り返しを減らそうとしています。私は、アレイ変数がvbscriptの配列にあるかどうかをチェックする方法

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

リトルヘルプを反復処理するように私は不明だ配列

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

に情報変数を入れて、この作業コード

<% If tree <> "" or (info <> "" and info <> "links" and info <> "privacy" and info <> "talks") 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を(作成することです。

InStr関数([比較、】文字列2、文字列1 [開始]) 文字列2を文字列1で見つからない場合、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

具体的に質問して以来、アレイを繰り返し処理する最も簡単な方法があります。 @ StackHound25の答えの

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

バート・バージョン(間違っUBOUND、ノー終了) –

+0

@ Ekkehard.HornerシンプルStackhoundの答えのバージョンではなく、間違ったUBOUND。配列は添え字0,1,2になります。ここでUBoundの値は実際には3になるかもしれませんが、ループの記述方法ではありません。私は意図的にUBoundを使用しないでください。出口は「ここでやる」の下に落ちる。それは明らかだろうと思った。どうしてこんなに多くの人がここで急にダウンボトムするのですか? – Daniel

+0

多くの人が低品質のコードを掲示し、自分の失業者のために口実を失う言い方をしているので(「個人的な好み」、どのように「出てくる」ことができますか?」 –

関連する問題