所以,在我的主mxml中,我有一个如此定义的变量:
[Bindable] public var studentsListDict:Dictionary = new Dictionary;
我还有以下导入:
import flash.utils.Dictionary;
然后我有一个导入XML文件的HTTPService:
<mx:HTTPService id="studentsHttp" url="students.xml" resultFormat="e4x" makeObjectsBindable="true" result="createStudentsCollection(event)" />
createStudentsCollection函数如下:
private function createStudentsCollection(e:ResultEvent):void
{
var xmlList:XMLList = XML(e.result).student;
var dupString:String = "|";
var tempArray:Array = new Array;
studentsListDict = new Dictionary;
for (var i:int = 0; i < xmlList.length(); i++)
{
if (dupString.indexOf(String("|" + xmlList[i].name) + "|") == -1)
{
tempArray = new Array;
tempArray[0] = xmlList[i].name.@id;
tempArray[1] = xmlList[i].name;
tempArray[2] = xmlList[i].year;
tempArray[3] = xmlList[i].track;
studentsListAC.addItem(tempArray);
studentsListDict[tempArray[0]] = tempArray;
dupString += "|" + xmlList[i].name + "|";
getLen(studentsListDict);
}
}
}
然后,为确保项目正确放入字典,我有以下功能:
public static function getLen(d:Dictionary):int
{
var i:int = 0;
for (var key:Object in d)
{
Alert.show(String(key + "\n" + d[key]));
i++;
}
return i;
}
这会创建弹出警报,显示所有内容都已正确加载到字典中。
稍后,在一个孩子中,我调用一个试图使用字典的函数,然后我得到一个“未定义”的返回。
这是基于键搜索的函数,并从数组中返回一个值:
public function getStudentName(sID:Number):String
{
return studentsListDict[sID][1];
}
不幸的是,getStudentName函数每次只返回undefined。
如果有人能看到我失踪的东西,我们将不胜感激。
谢谢, BRDS
修改
它没有工作b / c你不能将数字作为字典中的键。在声明和查找期间简单地将它们转换为字符串似乎工作正常。
答案 0 :(得分:2)
Here is some documentation on dictionary keys.。
看起来您的代码是将其设置为字符串,然后将其作为数字访问。我怀疑这是你问题的根源你可以尝试这样的事情:
public function getStudentName(sID:Number):String
{
return studentsListDict[sID.toString()][1];
}
将数字用作词典的键实际上是完全可以接受的。字典显然将该数字的数字和字符串值转换为相同的键。这是一个示例:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="application1_creationCompleteHandler(event)">
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
public var dict : Dictionary;
protected function application1_creationCompleteHandler(event:FlexEvent):void
{
dict = new Dictionary();
dict["0"] = "hi";
dict["4"] = "hola";
dict["17"] = "bye";
dict["32"] = "adios";
dict[32] = "adios 2";
dict[3.2] = "adios 3";
dict[50] = "Audio ";
dict["50"] = "Audio 2";
trace(dict["0"]);
trace(dict["4"]);
trace(dict["17"]);
trace(dict["32"]);
trace(dict[32]);
trace(dict[3.2]);
trace(dict[50]);
trace(dict["50"]);
}
]]>
</fx:Script>
</s:Application>
答案 1 :(得分:1)
我认为这是因为getStudentName
使用数字作为键,而createStudentCollection
使用字符串。在这种情况下,由于键是数字/字符串,您只需使用Object
:var studentsListDict:Object = {};
- 它会自动将所有键强制转换为字符串。
此外,作为一个帮助:new Dictionary();
更多标准,并且在ActionScript中使用[]
(例如var foo:Array = []
)而不是new Array()
的形式更好。这样你就可以同时把东西放在数组中了:
var tempArray:Array = [
xmlList[i].name.@id,
xmlList[i].name,
…
];