Scripting.Dictionary對象

來源:互聯網
上載者:User
對象


    許多Microsoft的程式設計語言,如Visual Basic、VBScript和Jscript,都提供集合(collection)。可以把集合想象為數組,可以使用其中內建的函數完成儲存和操縱資料等基本任務。無須擔心資料是在哪些行列,而是使用唯一的鍵進行訪問。
    VBScript和Jscript都提供類似的對象,通稱Scripting.Dictionary對象或Dictionary對象。它類似於二維數組,把鍵和相關條目的資料存放在一起。然而真正的物件導向的方法,不應直接存取資料條目,必須使用Dictionary對象支援的方法和屬性來實現。
    本章提供了一些樣本頁面,允許實驗指令碼運行期對象的方法和屬性。這些執行個體在下載的檔案的檔案的Chaper05子目錄裡。

5.3.1 建立和使用Dictionary對象
    建立一個Dictionary對象的樣本如下:
    ‘In VBScript:
    Dim objMyData
    Set objMyData = Server.CreateObject(“Scripting.Dictionary”)

    //In Jscript:
    var objMyData = Server.CreateObject(‘Scripting.Dictionary’);

    <!-- Server-Side with an OBJECT element -->
    <OBJECT RUNAT=”SERVER” SCOPE=”PAGE” ID=”objMyData”
            PROGID=”Scripting.Dictionary”>
    </OBJECT>
    Dictionary對象還可用於用戶端的IE中。
1.    Dictionary對象的成員概要
表5-2和表5-3列出了Dictionary對象的屬性和方法及相應的說明。
當增加一個鍵/條目對時,如果該鍵已存在;或者刪除一個鍵/條目對時,該關鍵字/條目對不存在,或改變已包含資料的Dictionary對象的CompareMode,都將產生錯誤。
表5-2  Dictionary對象的屬性和說明
屬 性    說 明
CompareMode    (僅用於VBScript)設定或返回鍵的字串比較模式
Count    唯讀。返回Dictionary裡的鍵/條目對的數量
Item(key)    設定或返回指定的鍵的條目值
Key(key)    設定索引值
表5-3  Dictionary對象的方法和說明
方 法    說 明
Add(key,item)    增加鍵/條目對到Dictionary
Exists(key)    如果指定的鍵存在,返回True,否則返回False
Items()    返回一個包含Dictionary對象中所有條目的數組
Keys()    返回一個包含Dictionary對象中所有鍵的數組
Remove(key)    刪除一個指定的鍵/條目對
RemoveAll()    刪除全部鍵/條目對
2.    對Dictionary中增加和刪除條目
一旦得到一個新的(空的)Dictionary,可以對其添加條目,從中擷取條目以及刪除條目:
‘ In VBScript:
objMyData.Add “MyKey”, “MyItem”            ‘Add Value MyItem with key MyKey
objMyData.Add “YourKey”, ”YourItem”        ‘Add value YourItem with key YourKey
blnIsThere = objMyData.Exists(“MyKey”)        ‘Returns True because the item exists
strItem = objMyData.Item(“YourKey”)            ‘Retrieve value of YourKey
strItem = objMyData.Remove(“MyKey”)        ‘Retrieve and remove YourKey
objMyData.RemoveAll                        ‘Remove all the items
在JScript中,等價的代碼為:
// In JScript;
objMyData.Add (‘MyKey’, ‘MyItem’);            //Add Value MyItem with key MyKey
objMyData.Add (‘YourKey’, ‘YourItem’);        //Add value YourItem with key YourKey
var blnIsThere = objMyData.Exists(‘MyKey’);    //Returns True because the item exists
var strItem = objMyData.Item(‘YourKey’);        //Retrieve value of YourKey
var strItem = objMyData.Remove(‘MyKey’);    //Retrieve and remove YourKey
objMyData.RemoveAll();                    //Remove all the items
3.    修改鍵或條目的值
可以通過修改鍵的值,或通過修改與特定的鍵關聯的條目的資料,來改變儲存在Dictionary內的資料。下面的代碼改變鍵為MyKey的條目中的資料。
ObjMyData.Item(“MyKey”) = “NewValue”        ‘ In VBScript
ObjMyData.Item(‘MyKey’) = ‘NewValue’;        // In JScript
如果指定的鍵在Dictionary未找到,將在Dictionary中建立一個以MyKey為鍵,以New Value為其條目值的新的鍵/條目對。有意思的是,如果使用一個不存在的鍵來檢索條目,不僅得到一個空的字串(這是可以想到的),而且還在Dictionary裡添加一個新的鍵/條目對,鍵即是指定的鍵,但條目的資料為空白。
可以使用Key屬性僅改變鍵的值而不改變與之對應的條目的資料。將一個已存在的鍵MyKey改變為MyNewKey,可以用:
objMyData.Key(“MyKey”) = “MyNewValue”        ‘ In VBScript
objMyData.Item(‘MyKey’) = ‘MyNewValue’;        // In JScript
如果指定的鍵未找到,則產生運行期錯誤。
4.    設定比較模式
Dictionary的CompareMode屬性僅適用於VBScript,不能在JScript中使用。當比較字串鍵時,允許指定比較的方式。兩個允許的值為BinaryCompare(0)和TextCompare(1)。BinaryCompare(0)為位元對照(即區分大小寫);TextCompare(1)為文本對照(即不區分大小寫)。
5.    遍曆Dictionary
研究Dictionary時,有兩個方法和一個屬性需要特別注意,它們允許我們遍曆儲存在Dictionary裡的所有鍵/條目對。Items方法用一個一維數組的形式返回Dictionary裡所有的條目資料,而keys方法用一個一維數組返回所有已存在的索引值。可以使用Count屬性得到鍵或條目的數量。
例如,可以使用下列代碼得到名稱為objMyData的Dictionary中所有的鍵和條目值。注意,雖然Count屬性儲存了在Dictionary裡的鍵/條目數量,但VBScript和JScript的數組總是從下標0開始的。因此,數組下標應從0到Count-1。
‘In VBScript:
arrKeys = objMyData.Keys                    ‘Get all the keys into an array
arrItems = objMyData.Items                    ‘Get all the items into an array

For intLoop = 0 To objMyData.Count –1        ‘Iterate through the array
    StrThisKey = arrKeys(intLoop)            ‘This is the key value
    StrThisItem = arrItems(intLoop)            ‘This is the item (data) value
Next

// In JScript
// Get VB-style arrays using the Keys() and Items() methods
var arrKeys = new VBArray(objMyData.Keys()).toArray();
var arrItems = new VBArray(objMyData.Items()).toArray();

for (intLoop = 0; intLoop < objMyData.Count; intLoop++) {
    // Iterate through the arrays
    strThisKey = arrKeys[intLoop];            // This is the key value
    strThisItem = arrItems[intLoop];            // This is the item (data) value
}
在VBScript裡也可以使用For Each … Next陳述式完成同樣的功能:
‘ Iterate the dictionary as a collection in VBScript
For Each objItem in arrItems
    Response.Write objItem & “ = “ & arrItems(objItem) & “<BR>”
Next
5.3.2 Dictionary對象樣本
       本書提供了一系列樣本檔案可用來實驗指令碼已耗用時間庫的各種屬性。
       本章代碼的預設頁面提供了一系列可使用的VBScript樣本連結。有些樣本對JScript同樣有效。這些樣本存放在Chapter05目錄下相應的子目錄裡,顯示的介面如圖5-2所示:

       要查看Dictionary對象的運行,在菜單頁面點擊第一個連結,開啟名叫show_dictionary.asp的頁面。這個頁面顯示了我們提供的Dictionary對象的內容,允許實驗其屬性和方法。螢幕如圖5-3所示:

1.  Dictionary的global.asa檔案
隨Dictionary對象樣本頁面提供的檔案之一是global.asa。它建立並預先填充了一個會話層範圍的Dictionary對象,因此其內容在頁面請求之間不會丟失。一般說來(考慮到可擴充性),這不是一個理想的做法。在這個例子裡,可以看到Dictionary的屬性和方法的效果。
如果在自己的伺服器上下載並安裝樣本,必須建立一個基於此global.asa檔案的虛擬應用程式。或者將其內容添加到預設網站的根資料夾中的global.asa檔案裡。在第3章講述了如何用嚮導建立虛擬應用程式。然而對於本樣本,建立一個虛擬應用程式最簡單的方法是在Chapter05樣本檔案夾內右擊dictionary子檔案夾,在Properties對話方塊的Home Directory選項卡裡,點擊Create按鈕,如圖5-4所示:

在這個global.asa檔案裡,代碼使用<OBJECT>元素建立一個會話層範圍的Scripting.Dictionary對象執行個體。然後在Session_onStart事件處理常式裡將一系列值用Add方法放入Dictionary中,並將對Dictionary對象的引用指定給ASP會話變數MyDictionary:
<OBJECT ID="objBookList" RUNAT="SERVER" SCOPE="SESSION"
        PROGID="Scripting.Dictionary">
</OBJECT>

<SCRIPT LANGUAGE="VBScript" RUNAT="SERVER">

Sub Session_onStart()
  objBookList.Add "2610", "Professional Active Server Pages 3.0"
  objBookList.Add "1274", "Instant JavaScript"
  objBookList.Add "2882", "Beginning ASP Components"
  objBookList.Add "1797", "Professional ASP Techniques"
  objBookList.Add "1835", "AD0 2.0 Programmer's Reference"
  Set Session("MyDictionary") = objBookList
End Sub

</SCRIPT>
2.  Dictionary樣本頁面
在“Scripting.Dictionary Object”首頁面裡,首要的任務是得到一個會話層範圍的Dictionary對象執行個體的引用。注意,這個引用是一個物件變數,因此必須在VBScript裡使用Set關鍵字。
然後,檢查一下是否得到了一個對象(這是個好習慣),如果沒有正確地建立包含global.asa檔案的虛擬應用程式,檢查一下問題出在哪裡。你將看到我們自己的訊息代替了ASP的錯誤訊息(但是注意,對於這一操作必須關閉預設的錯誤處理)。
<%

on error resume next  ' turn off error handling to test if object exists

'retrieve Dictionary object from user's session
Set objMyData = Session("MyDictionary")

If IsObject(objMyData) Then  'found Dictionary object in Session

%>

<P><DIV CLASS="subhead">Iterating the Dictionary with Arrays</DIV>
<%
arrKeysArray = objMyData.Keys           'get all the keys into an array
arrItemsArray = objMyData.Items         'get all the items into an array
For intLoop = 0 To objMyData.Count - 1   'iterate through the array
    Response.Write "Key: <B>" & arrKeysArray(intLoop) & "</B>   Value: <B>" _
                 & arrItemsArray(intLoop)& "</B><BR>"
Next
%>

… Other code and controls go here …

  <%
Else

  'could not find Dictionary object in the session
  Response.Write "Dictionary object not available in global.asa for session"

End If
%>
顯示在頁面上的Dictionary內容列表是使用Dictionary對象的Key和Items方法建立的兩個數組,可使用前面的代碼遍曆它們。
3.  Dictionary頁面控制項
在Dictionary的內容列表下是一系列的HTML控制項,可用於設定Dictionary對象的某些屬性和執行各種方法。這些控制項全部在一個<FORM>內,其ACTION屬性值是本頁面,所以表單的內容提交回本頁面。在前面的章節的樣本裡使用了同樣的技術。
在<FORM>段中,改變屬性或執行一個方法是通過一個按鈕(沒有標題)實現的。用於屬性和方法的值放入按鈕旁的文字框或列表框中。
該頁的第一個按鈕用於設定Dictionary裡的條目的Key屬性。這裡使用了一個下拉式清單,可以選擇一個已經存在的Key值。下面的代碼建立了頁面內該部分的控制項。為了填充列表,使用了另外一個遍曆Dictionary對象的技術,即For Each … Next語句。代碼如下:

<FORM ACTION="<% = Request.ServerVariables("SCRIPT_NAME") %>" METHOD="POST">

  <P><DIV CLASS="subhead">The Dictionary Properties</DIV>
  <INPUT TYPE="SUBMIT" NAME="cmdChangeKey" VALUE="   ">
    Dictionary.Key ("
  <SELECT NAME="lstChangeKey" SIZE="1">
  <%
  For Each objItem in objMyData
    Response.Write "<OPTION>" & objItem
  Next
  %>
  </SELECT> ") = "
  <INPUT TYPE="TEXT" NAME="txtChangeKey" SIZE="15" VALUE="New Key Name"> "
  <BR>
  …
  … Other controls go here …
  …
</FORM>

4.  使用Dictionary的屬性和方法
在“Scription.Dictionary Object”頁面,點擊用來檢查並改變條目的Key屬性的按鈕,如圖5-5所示:

把表單再次提交給頁面。該頁麵包含一個指令碼段,檢查被點擊的按鈕的值。它通過在Resquest.Form集合裡尋找按鈕的名字來斷定單擊的是哪個按鈕。如果發現一個對應於cmdChangKey的值,則從列表中或文字框中得到相應的值並用來改變Key屬性:

'look for a command sent from the FORM section buttons
If Len(Request.Form("cmdChangeKey")) Then
    strKeyName = Request.Form("lstChangeKey")           'Existing key from list box
    strNewKey = Request.Form("txtChangeKey")            'New key value from text box
    objMyData.Key(strKeyName) = strNewKey               'Set key property of this item
End If

頁面重新載入後,在Dictionary的內容列表裡能看到相應的結果,如圖5-6所示:

頁面的其餘代碼用來設定一個條目的Item屬性,或者執行Dictionary對象的方法。下面是這些操作的代碼,每段代碼與示範Key屬性的代碼非常類似。每次都將結果顯示在Dictionary的內容列表中:

If Len(Request.Form("cmdChangeItem")) Then
    strKeyName = Request.Form("lstChangeItem")   'Existing key from list box
    strNewValue = Request.Form("txtChangeItem")   'New item value from text box
    objMyData.Item(strKeyName) = strNewValue     'Set the Item property
End If

If Len(Request.Form("cmdAdd")) Then
strKeyName = Request.Form("txtAddKey")         'New key value from text box
    strItemValue = Request.Form("txtAddItem")        'New item value from text box
    objMyData.Add strKeyName, strItemValue          'Execute the Add method
End If

If Len(Request.Form("cmdRemove")) Then
    strKeyName = Request.Form("lstRemove")         'Existion key from list box
    objMyData.Remove strKeyName                        'Execute the Remove method
End If

If Len(Request.Form("cmdRemoveAll")) Then
    objMyData.RemoveAll                                      'Execute the RemoveAll method
End If

例如,如果現在點擊Add方法的按鈕,在Dictionary的內容列表裡將增加一個新的條目,如圖5-7所示:

結果如圖5-8所示:

可以在這個頁面中實驗Dictionary對象的屬性和方法,你將會發現什麼因素及在什麼環境下能引起Dictionary對象錯誤。例如,嘗試用與已經存在的一個條目相同的索引值增加一個條目,看看會出現什麼結果。




相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。