2010-01-28 5 views
2

En essayant d'étendre le flexible ArrayCollection pour pouvoir rechercher un objet contenant des données spécifiques et le rendre.Flex bouclant à travers l'objet

Voici ma fonction:

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; 
    } 

problème est j est toujours nulle de sorte que la deuxième boucle ne fonctionne jamais. J'ai donc lu des descriptions de boucles flexibles et en fait cela devrait fonctionner correctement. Quel peut être le problème?

Répondre

2

Essayez comme ceci:

for (var name:String in myObject){ 
    trace(name + ":" + myObject[name]; 
} 

D'accord qui était en fait le même que vous faisiez. L'erreur doit être dans cette ligne:

for each(var i: Object in this) { 

Essayez d'utiliser ceci:

for each(var i: Object in this.source) { 
+0

Est-ce différent de la syntaxe dans la question? –

+0

Non, vous avez raison! Éditera ma réponse. – Thomas

0

Mon premier instinct serait d'avoir un regard sur le type de données. Vous configurez une boucle en déclarant j:String et le symptôme est que j est toujours null. Cela me suggère que Flex ne parvient pas à interpréter les éléments de i comme des chaînes. Si Flex reconnaît uniquement les éléments i en tant qu'objets (car toutes les chaînes sont des objets et que les objets sont le plus petit dénominateur commun), il renvoie null pour j:String.

Essayez ceci pour votre boucle intérieure:

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

si vous utilisez ArrayCollection comme votre source de données, vous devriez regarder en utilisant l'interface IViewCursor. Vous pouvez fournir une fonction de comparaison personnalisée ou fournir les champs supérieurs à. Cette interface est bien documenté avec des exemples en 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; 

si vous êtes la recherche d'une valeur dans une propriété spécifique, son encore plus facile. Voici le lien vers adobe livedocs sur ce sujet