coldfusion在数组中查找结构

时间:2013-06-26 09:40:28

标签: java arrays coldfusion coldfusion-9

我有一个包含结构数组的对象,生成它的代码循环遍历查询,从查询的每一行获取各种值并填充结构,当行完成时,它将它附加到数组并且这个过程再次开始:

<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来解决这个问题我会很高兴。

3 个答案:

答案 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")