2013-06-26 2 views
1

J'ai un objet qui contient un tableau de structures, le code qui le génère boucle sur une requête, prend différentes valeurs de chaque ligne de la requête et remplit une structure, quand la ligne est terminée il ajoute à un tableau et le processus recommence:coldfusion trouver une structure dans un tableau

<cfscript> 
    variables.x = 1; 
    variables.aArray = []; 
    // loop over my query 
    while(variables.x lte variables.qQuery.recordcount){ 
     variables.stStruct   = {}; 
     variables.stStruct.nID  = variables.qQuery.id[variables.x]; 
     variables.stStruct.sText = variables.qQuery.text[variables.x]; 

     //etc... 

     arrayAppend(variables.aArray,variables.stStruct); 
     variables.x++; 
    } 
    variables.oObject.setArray(variables.aArray); 
</cfscript> 

plus tard dans mon code, je veux être en mesure de tirer les détails sur les éléments de ce tableau avec seulement les JNV à titre indicatif. Je ne connais pas la position du tableau de ce nID, ce qui signifie utiliser une méthode convulatoire pour essayer de le trouver.

J'ai eu l'idée de créer une structure de positions à côté de lui en modifiant le code ci-dessus avec.

<cfscript> 
    variables.x = 1; 
    variables.aArray = []; 
    variables.stTracker = {}; 

    while...yadda 
     variables.stStruct = {}; 
     yadda yadda 

     structInsert(variables.stTracker,"variables.qQuery.id[variables.x]","variables.x"); 
     variables.x++; 

    while end 

    variables.oObject.setArray(variables.aArray); 
    variables.oObject.setTracker(variables.stTracker); 
</cfscript> 

Ce qui signifierait alors que je pouvais faire quelque chose comme variables.nPosition = structFindKey(variables.oObject.getTracker(),'88')[1].value;. Cela semble toujours assez inélégant et je me demande s'il me manque quelque chose qui rend cela beaucoup plus facile que ce que je fais.

Je serais très heureux s'il y avait une solution utilisant Java pour résoudre ce problème.

+0

L'ordre dans lequel les éléments sont ajoutés à la question du tableau? – AlexP

+0

Non, mais pour le moment ils vont dans le même sens que je l'ai, mais l'ordre de la requête sort. – Jarede

Répondre

1

Au lieu de construire un tableau de structures à partir d'une requête existante, je recommande d'effectuer un Query of Queries. Il vous permettra d'utiliser des instructions SQL pour interroger votre jeu de résultats existant en mémoire. Cela suppose que toutes les données dont vous avez besoin sont déjà disponibles dans la requête existante (cela ressemble à votre question).

Un exemple de requête requête serait:

<cfquery dbtype="query" name="qoqexample"> 
    SELECT id, text, other_columns 
    FROM variables.qQuery 
    WHERE id = <cfqueryparam cfsqltype="cf_sql_integer" value="#nID#"> 
</cfquery> 
+0

Avec cette solution, je suppose que vous suggérez de greffer la requête avec moi sur l'objet comme 'variables.oObject.setQuery (varibles.qQuery)', puis d'exécuter la QoQ chaque fois que j'ai besoin d'y accéder. C'est une solution mais pas élégante si c'est le cas. – Jarede

+0

Non, je ne suggérais pas que vous ajoutiez la requête à votre objet. Je ne comprends peut-être pas l'intégralité de votre code mais je supposais que vous pouviez conserver votre objet et votre requête en tant qu'entités distinctes; comme ils sont actuellement. Lorsque vous avez besoin d'interroger le jeu de résultats, faites-le à partir de la variable 'variables.qQuery'. –

+0

ahh bien la requête provient d'un DAO et dans le DAO theres une fonction qui remplit l'objet ... donc une fois que l'objet est rempli la requête n'existe plus, donc je devrais remplir un setter sur l'objet avec le requête originale pour que cette solution fonctionne. – Jarede

1

Vous pouvez utiliser Java LinkedHashMap qui fonctionne comme un struct, mais maintiendra l'ordre dans lequel les éléments ont été ajoutés. Cela signifie que vous n'avez pas besoin d'utiliser un tableau du tout (il n'est pas certain que ce sera un problème pour vous)

Vous pourrez utiliser toutes vos fonctions natives CF sur cet objet comme vous le feriez pour une structure normale.

var container = createObject("java", "java.util.LinkedHashMap").init(); 
for (var x = 1; x <= qQuery.recordCount; x++) { 
    container[qQuery['nid'][x]] = qQuery['stext'][x]; 
} 

test pour une clé comme d'habitude:

structKeyExists(container, '123'); 

http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html

L'autre option, je crois que vous avez envisagé est une carte du nid à la position d'index de tableau ici keys:

var keys = {}; 
var container = []; 
for (var x = 1; x <= qQuery.recordCount; x++) { 
    var item = {}; 
    item[qQuery['nid'][x]] = qQuery['stext'][x]; 

    container[x] = item; 
    keys[qQuery['nid'][x]] = x; 
} 
+0

Je suppose que je suis peut-être en train d'essayer de faire des choses en arrière et que je pourrais simplement le déplacer en une structure de structures qui annulerait le besoin de LinkedHashMap. – Jarede

+0

* Re: ce qui annulerait le besoin de LinkedHashMap * Pas tout à fait. Contrairement aux structures CF, les LinkedHashMap ont un "ordre d'itération prévisible". Dans un sens, il combine les qualités d'un tableau et d'une structure. Si vous devez maintenir l'ordre des éléments, c'est une différence significative par rapport aux structures standard des FC. – Leigh

+0

C'est vrai, mais pour mes propres besoins, puisque l'ordre n'a pas besoin d'être conservé, un LinkedHashMap ne ferait rien de plus qu'une structure de structures. Mais bon conseil @Leigh – Jarede

1

CFLib.org semble avoir une probabilité candidat: arrayOfStructsFind

<cfscript> 
/** 
* Returns the position of an element in an array of structures. 
* 
* @param array  Array to search. (Required) 
* @param searchKey  Key to check in the structs. (Required) 
* @param value  Value to search for. (Required) 
* @return Returns the numeric index of a match. 
* @author Nath Arduini ([email protected]) 
* @version 0, June 11, 2009 
*/ 
function arrayOfStructsFind(Array, SearchKey, Value){ 
    var result = 0; 
    var i = 1; 
    var key = ""; 
    for (i=1;i lte arrayLen(array);i=i+1){ 
     for (key in array[i]) 
     { 
      if(array[i][key]==Value and key == SearchKey){ 
       result = i; 
       return result; 
      } 
     } 
    } 

    return result; 
} 
</cfscript> 

Ainsi, dans votre cas, vous l'utiliser comme:

ArrayOfStructsFind(variables.oObject.getArray(),"nID","12345") 
Questions connexes