1

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

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

4

3 回答 3

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")
于 2013-06-26T12:43:12.567 回答
1

您可以使用LinkedHashMap像结构一样工作的 Java,但会保持添加元素的顺序。这意味着您根本不需要使用数组(不清楚这是否对您来说是个问题)

您将能够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;
}
于 2013-06-26T12:31:43.777 回答
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> 
于 2013-06-26T12:19:42.850 回答