【问题标题】:Nested structures not sorted correctly嵌套结构未正确排序
【发布时间】:2019-08-03 22:26:06
【问题描述】:

我正在循环一个查询,构建一个结构数组

<cffunction name="QueryConvert" returntype="any" output="false">
    <cfargument name="q" type="query" required="yes">
    <cfargument name="page" type="numeric" required="no" default="1">
    <cfargument name="rows" type="numeric" required="no" default="500">
    <cfset var result = structnew()>
    <cfset var rowStruct = structnew()>
    <cfset var col = "">
    <cfset result["page"] = arguments.page>
    <cfset result["total"] = ceiling(arguments.q.TotalrecordCount/arguments.rows)>
    <cfset result["records"] = arguments.q.TotalrecordCount>
    <cfset result["rows"] = arraynew(1)>
    <cfset queryDeleteColumn(arguments.q,'TotalrecordCount')>
    <cfset queryDeleteColumn(arguments.q,'rowNum')>
    <cfset columnLabels = QueryColumnArray(arguments.q)>
    <cfset rowStruct = [:]><!--- Tada an ordered struct --->
    <cfloop array="#columnLabels#" item="col">
         <cfset rowStruct[col] = q["#col#"]>
    </cfloop>
    <cfdump var="#result#" abort>
    <cfreturn result />
</cffunction>

但是当我查看嵌套结构时,键的顺序都混淆了。我希望它们与数据库表中列名的顺序相匹配。

【问题讨论】:

标签: struct coldfusion cfml lucee cfloop


【解决方案1】:

简短的回答是您需要使用有序结构。长版如下所示:

首先我们需要看一些样本数据

 <cfscript>
 q = queryNew("id,name,category","Integer,Varchar,Varchar", 
     [{id=1, name="One", category="Cat"},{id=2, name="Two", category="Dog"}]
 );


 writedump(q);
 </cfscript>

让我们看看样本数据。请注意,这些列与预期不符。

现在让我们准备好我们的 columnLabels。请注意,我们正在创建一个数组。

 </cfscript>
 result.rows = [];

 columnLabels = q.getMeta().getColumnLabels();
 writedump(columnLabels);
 </cfscript>

<cfloop query="q">
   <cfset rowStruct = [:]><!--- Tada an ordered struct --->
   <cfloop array="#columnLabels#" item="col">
       <cfset rowStruct[col] = q["#col#"]>
   </cfloop>

   <cfset arrayappend(result.rows, rowStruct)>
</cfloop>

<cfdump var="#result.rows#">

多田

此外

使用cfscript 更容易阅读

<cfscript>
for (row in q)  {
    rowStruct = [:];
    for (col in columnLabels)    {
        rowStruct[col] = q["#col#"];
    }
    result.rows.append(rowStruct);
}
</cfscript>

如需实时版本,请参阅:CFFiddle.com

【讨论】:

  • 唱 Lucee,这就是我所拥有的 &lt;cfargument name="q" type="query" required="yes"&gt; &lt;cfset arguments.q = arguments.q.getMeta().getColumnLabels()&gt; - 但是有一个错误说没有 The function [getMeta] does not exist in the Object, only the following functions are available: [addColumn,addRow,columnArray,columnCount,columnData,columnExists,columnList,currentRow,deleteColumn,deleteRow,....t].
  • 我正在更新我拥有的功能的帖子中的代码
  • 用我现在作为函数使用的更新代码更新了我的问题
  • 是的,使用 Lucee
  • FWIW,记录在案的 getMetaData(queryObj) 函数应该适用于两者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
相关资源
最近更新 更多