我试图扩展flex ArrayCollection以便能够搜索包含特定数据的对象并将其还原。
这是我的功能:
public function getItemContaining(value: String): Object {
//Loop through the collection
for each(var i: Object in this) {
//Loop through fields
for(var j: String in i) {
//If field value is equal to input value
if(i[j] == value) {
return i;
}
}
}
//If not found
return null;
}
问题是j总是为空,所以第二个循环永远不会起作用。所以我读了flex循环描述,实际上它应该工作得很好。可能是什么问题?
答案 0 :(得分:2)
试试这样:
for (var name:String in myObject){
trace(name + ":" + myObject[name];
}
好的,你实际上和你一样。错误必须在此行中:
for each(var i: Object in this) {
尝试使用:
for each(var i: Object in this.source) {
答案 1 :(得分:0)
我的第一直觉是看看数据类型。您正在设置一个声明j:String
的循环,症状是j
始终为空。这告诉我Flex没有将i
的元素解释为字符串。如果Flex仅将i
的元素识别为对象(因为所有字符串都是对象,而对象是最低的公分母),则它将为j:String
返回null。
试试这个内循环:
for(var j: Object in i) {
//If field value is equal to input value
if(i[j] is String && (i[j] as String) == value) {
return i;
}
}
答案 2 :(得分:0)
如果您使用ArrayCollection作为数据源,则应该查看使用IViewCursor接口。您可以提供自定义比较功能,或提供顶部比较的字段。 adobe / livedocs中的示例详细记录了此接口
var _cursor:IViewCursor;
var _idSortField:SortField;
var _idSort:Sort = new Sort();
_idSortField = new SortField();
_idSortField.compareFunction = this.myCompareFunction;
_idSort.fields = [_idSortField];
myArrayCollection.sort = _idSort;
myArrayCollection.refresh();
_cursor = myArrayCollection.createCursor();
if (_cursor.findAny(search))
return _cursor;
如果您要搜索特定属性中的值,则更容易。这是adobe livedocs关于此主题的链接