在For ... Each循环的第二次迭代中动态获取VBScript(经典ASP)字典对象值时出错

时间:2010-12-08 00:22:57

标签: arrays dictionary asp-classic vbscript loops

是的,这是一个漫长而令人费解的标题......对不起。

我正在VBScript中使用优质的ASP。我有一个字典对象,字典中的每个对象都包含它的Key和一个Array作为Item。

Dim myDictionary
Set myDictionary = CreateObject("Scripting.Dictionary")

myDictionary.Add "a", Array("a1","a2")
myDictionary.Add "b", Array("b1","b2")
myDictionary.Add "c", Array("c1","c2")

我还在脚本中传递了一个字符串列表(并转换为一个数组),它与各种字典条目相对应,因此只有那些条目可以显示在页面上,并按照数组的顺序显示。 / p>

Dim myText
myText = "a, b, c"

Dim myArray
myArray = Split(myText,",")

现在,我想迭代数组,并在myDictionary中显示每个相应Key的内容。

For Each thing in myArray
    Response.Write myDictionary.Item(thing)(0) & "&nbsp;" & myDictionary.Item(thing)(1) & "<br />" & vbcrlf
Next

它在第一次迭代中完美运行,并正确打印到页面。但是在第二次迭代中,我得到一个错误。这是页面上的完整输出:

  

a1 a2

     

Microsoft VBScript运行时错误

     

'800a000d'类型不匹配:'项目(...)'

     

/Alpine/en_us/testCase.asp,第28行

任何人都知道为什么这不起作用?当然,这里显示的代码只是一个测试用例,但我在我的应用程序中遇到了完全相同的问题。

以下是完整的代码,因此您可以将其粘贴到测试环境中,如果它可以帮助您解决这个问题:

<%@LANGUAGE="VBSCRIPT"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Iterating through Dictionary objects - Test Case</title>
</head>

<body>

<%


Dim myDictionary
Set myDictionary = CreateObject("Scripting.Dictionary")

myDictionary.Add "a", Array("a1","a2")
myDictionary.Add "b", Array("b1","b2")
myDictionary.Add "c", Array("c1","c2")

Dim myText
myText = "a, b, c"

Dim myArray
myArray = Split(myText,",")

For Each thing in myArray
    Response.Write myDictionary.Item(thing)(0) & "&nbsp;" & myDictionary.Item(thing)(1) & "<br />" & vbcrlf
Next

%>


</body>
</html>

关于这个问题的其他一些有趣的内容......

当我在迭代中对所有三个字典条目进行硬编码时,它可以正常工作:

For Each thing in myArray
    Response.Write myDictionary.Item("a")(0) & "&nbsp;" & myDictionary.Item("a")(1) & "<br />" & vbcrlf
    Response.Write myDictionary.Item("b")(0) & "&nbsp;" & myDictionary.Item("b")(1) & "<br />" & vbcrlf
    Response.Write myDictionary.Item("c")(0) & "&nbsp;" & myDictionary.Item("c")(1) & "<br />" & vbcrlf
Next

产生这个:

  

a1 a2
  b1 b2
  c1 c2
  a1 a2
  b1 b2
  c1 c2
  a1 a2
  b1 b2
  c1 c2

并验证For-Each循环中的'thing'变量是否有效:

For Each thing in myArray
    Response.Write thing
Next

产生这个:

  

a b c

我很困惑......

谢谢大家!我非常感谢您提供的任何帮助。 : - )

干杯,
Lelando

1 个答案:

答案 0 :(得分:3)

这是因为myText中的逗号后面有空格。 Split函数创建一个值为"a", " b", " c"的数组。您的词典中不存在后两个值。

替换

myText = "a, b, c"

使用

myText = "a,b,c"

或者使用", "更改您的令牌分隔符(请注意空格)。