ошибка при получении значений объекта словаря VBScript (Classic ASP) динамически на 2-й итерации цикла For ... Each - PullRequest
0 голосов
/ 08 декабря 2010

Да, это длинный и запутанный заголовок ... извините.

Я работаю в VBScript в хорошем старомодном ASP. У меня есть объект словаря, и каждый объект в словаре состоит из его ключа и массива в качестве элемента.

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,",")

Теперь я хочу перебрать массив и показать содержимое каждого соответствующего ключа в myDictionary.

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

Отлично работает в первой итерации и правильно печатает на странице. Но на 2-й итерации я получаю ошибку. Вот полный вывод на странице:

a1 a2

Ошибка выполнения Microsoft VBScript

'800a000d' Несоответствие типов: 'Item (...)'

/ 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
с1 с2
а1 а2
b1 b2
с1 с2
a1 a2
b1 b2
с1 с2

И чтобы убедиться, что переменная 'вещь' в цикле For-Each работает:

For Each thing in myArray
    Response.Write thing
Next

Производит это:

a b c

Я в замешательстве ...

Спасибо всем! Я действительно ценю любую помощь, которую вы можете оказать. : -)

Приветствия
Lelando

1 Ответ

3 голосов
/ 08 декабря 2010

Это потому, что у вас есть пробелы после запятых в myText. Функция Split создает массив со значениями "a", " b", " c". Вторые два значения не существуют в вашем словаре.

Заменить строку

myText = "a, b, c"

С

myText = "a,b,c"

Или измените свой токен с помощью ", " (обратите внимание на пробел).

...