2

我试图扩展 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 循环描述,实际上它应该可以正常工作。可能是什么问题?

4

3 回答 3

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) {
于 2010-01-28T13:45:24.557 回答
0

我的第一直觉是看一下数据类型。您正在设置一个循环声明j:String,并且症状j始终为空。这表明 Flex 未能将 的元素解释i为字符串。如果 Flex 仅将 的元素识别i为对象(因为所有字符串都是对象,而对象是最小公分母),它将为j:String.

试试这个你的内部循环:

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;
    }
}
于 2010-01-28T16:31:15.253 回答
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的链接

于 2010-01-28T18:11:28.667 回答