2010-01-28 71 views
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循環描述,實際上它應該工作得很好。可能是什麼問題?

回答

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) { 
+0

這與問題中的語法有何不同? – 2010-01-28 16:05:36

+0

不,你說得對!將編輯我的答案。 – Thomas 2010-01-28 16:20:27

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; 
    } 
} 
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的鏈接