我有一个包含结构数组的对象,生成它的代码循环遍历查询,从查询的每一行获取各种值并填充结构,当行完成时,它将它附加到数组并且这个过程再次开始:
<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作为指导。我不知道那个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 :(得分: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>
答案 1 :(得分: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;
}
答案 2 :(得分: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 (nathbot@gmail.com)
* @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")