2013-06-26 63 views
1

我有一個包含結構數組的對象,生成它的代碼在查詢上循環,從查詢的每一行獲取各種值,並在行完成時填充結構它追加到一個數組,並再次開始該過程:後來coldfusion在數組中找到一個結構

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

在我的代碼我希望能夠拉出來的細節有關的項目數組中,只有全國免疫指導。我不知道那個nID的數組位置,這意味着使用一種試圖找到它的抽象方法。

我有一個想法,通過改變上面的代碼來創建位置結構。

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

這意味着我可以做點像variables.nPosition = structFindKey(variables.oObject.getTracker(),'88')[1].value;。這仍然感覺非常不雅,我想知道是否我錯過了一些讓我比現在更容易的東西。

如果有解決方案使用java解決這個問題,我會很高興。

+0

是否順序的項目將被添加到陣列的事? – AlexP

+0

不,但目前他們進入很像我擁有它,但查詢的順序出來。 – Jarede

回答

1

而不是從現有的查詢建立一個結構陣列我會建議執行一個Query of Queries。它將允許您使用SQL語句查詢內存中的現有結果集。這假設您需要的所有數據在現有查詢中已經可用(聽起來像是來自您的問題)。查詢

示例查詢是:

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

有了這個解決方案,我假設你建議我在對象上捎帶查詢,比如'variables.oObject.setQuery(varibles.qQuery)',然後在我需要從中訪問信息時運行QoQ。這是一個解決方案,但不是一個優雅的解決方案。 – Jarede

+0

不,我不是建議你將查詢添加到你的對象。我可能不瞭解你的代碼的全部,但我假設你可以保持你的對象和查詢作爲單獨的實體;因爲他們現在是。當你需要查詢結果集時,從'variables.qQuery'變量中執行。 –

+0

ahh以及查詢來自一個DAO和DAO內的一個函數,填充對象...所以一旦對象被填充查詢不再存在,所以我將不得不填充對象的setter與原始查詢此解決方案的工作。 – Jarede

1

您可以使用Java LinkedHashMap其作品就像一個結構,但仍將保持在所加入元素的順序。這意味着你根本不需要使用陣列(目前尚不清楚這是否會成爲問題)

您將能夠像使用普通結構一樣,在該對象上使用所有原生的CF函數。

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

測試一鍵像往常一樣:

structKeyExists(container, '123'); 

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

另一種選擇,我相信你認爲是地圖的nid到數組索引位置在這裏爲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

我想也許我試圖做屁股後退的事情,可以將其移動到結構的結構,這將否定對LinkedHashMap的需要。 – Jarede

+0

* Re:這會否定對LinkedHashMap的需求*不完全。與CF結構不同,LinkedHashMap具有「可預測的迭代順序」。從某種意義上說,它結合了數組和結構的特性。如果您需要維護元素的排序,那麼這與標準CF結構有很大的不同。 – Leigh

+0

這是真的,但爲了我自己的需要,因爲順序不需要保留,所以LinkedHashMap不會做任何比結構體更多的事情。但好建議@Leigh – Jarede

1

CFLib.org看起來像它有可能候選人: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> 

所以,你的情況,你可以使用它作爲:

ArrayOfStructsFind(variables.oObject.getArray(),"nID","12345") 
相關問題