微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将查询结果作为格式化的字段名和字段值类型返回

如何解决将查询结果作为格式化的字段名和字段值类型返回

我正在尝试获取查询结果以将查询结果提供为:ArrayofStructs 但是

按照我想要的方式

[
    {"fieldname" : "Action",FieldValue":"Update"},{"fieldname" : "MainTitle",FieldValue":"Please Update Database"}
]

上面的例子如果只是一行,但我有 10 行,我正在尝试像上面那样的输出,我怎么能在冷融合中做,如果它不像上面的情况,我可以用 {{1}但这真的很烦人

这是我的查询

arrayofstructs

我正在使用 ACF 2021

正如您所注意到的,它实际上将列名和字段值作为单独的而不是键/对输出

解决方法

我将使用 QueryReduce 调用来获取查询结果中的 ArrayOfStruct 输出。

<cfset result = myQuery.reduce(function(result=[],values){
  local.temp = [];
  for(local.key in arguments.values){
    local.temp.append({
      fieldname: local.key,FieldValue: arguments.values[local.key]
    });
  }
  arguments.result.append(local.temp);
  return arguments.result;
})>
,

由于问题被标记为 Lucee,rrk 的解决方案看起来是一个不错的方法。对于 Adob​​e Coldfusion 解决方案,您可以使用嵌套循环。下面的代码将简单地将每个查询行的字段/值对输出到一行中。

<cfoutput>
    <cfloop query = "myQuery">
        <cfloop list = "#myQuery.columnlist#" index = ColumnName>
            #ColumnName#  #myQuery[ColumnName][currentrow]#
        </cfloop>    
        <br>
    </cfloop>
</cfoutput>

您可以看到带有两行示例数据 here 的结果。

,

我同意 rrk。使用 reduce() 将相当快速和高效,并且应该能够做您想做的事。

回顾那段代码,我意识到它和我做的几乎一样。它得到两个嵌套数组的原因是附加到 local.temp = [] 中。如果您删除该逻辑,您应该能够仅创建您正在寻找的单个结构数组。

我改变的另一件事是使用箭头函数。它们与写出完整函数没有太大区别,但它们更加紧凑和干净。它们需要一点时间来适应,但我使用得越多,我就越喜欢它们。

如果可以,我也会尽量避免显式循环。在处理更大的数据集时,使用 reduce() 之类的东西可以明显更快。

我下面的代码将在 CF2018 或更高版本中运行,并且既然您指定了 CF2021,那么您应该很高兴。

<cfscript>
    res = myQuery.reduce( (prev,nxt) => {
        prev.append({"FIELDNAME":nxt.Action,"FIELDVALUE":nxt.MainTitle});
        return prev;
        },[]
    );
</cfscript>

小提琴更加充实。 https://cffiddle.org/app/file?filepath=89565618-18ae-49e0-bed0-bdb9fb6a4162/04567bb5-ec53-4097-a941-bb2b5f42a499/ec51b428-ec53-4606-a828-8dcce9b954b0.cfm

最后,几点说明。我不完全确定您是如何使用这些数据的,因此这些建议甚至可能无关紧要。此外,您的代码似乎表明您正在执行查询查询。这也可能不需要(以及其中的 ORDER BY)。您的页面中可能已经有了可用的数据,可以从原始查询数据中提取出来。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。