2010-01-28 2 views
2

Im пытается расширить flex ArrayCollection, чтобы иметь возможность искать объект, содержащий конкретные данные, и возвращать его.Flex looping через объект

Вот моя функция:

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 всегда нуль, так что второй цикл не работает. Поэтому я читал описания гибких циклов, и на самом деле это должно работать нормально. Что может быть проблемой?

ответ

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

Это отличается от синтаксиса в вопросе? –

+0

Нет, ты прав! Изменит мой ответ. – Thomas

0

Мой первый инстинкт должен был бы посмотреть на тип данных. Вы настраиваете цикл, объявляющий j:String, и симптом заключается в том, что j всегда имеет значение null. Это говорит мне о том, что Flex не интерпретирует элементы i как строки. Если Flex только распознает элементы i как объекты (поскольку все строки являются объектами, а объекты - самым низким общим знаменателем), он возвращает null для 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. Вы можете предоставить пользовательскую функцию сравнения или поставить поля, сравнимые по сравнению с. Этот интерфейс хорошо документирован с примерами в глинобитных/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 по этой теме

 Смежные вопросы

  • Нет связанных вопросов^_^