如何解决将查询结果作为格式化的字段名和字段值类型返回
我正在尝试获取查询结果以将查询结果提供为: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 的解决方案看起来是一个不错的方法。对于 Adobe 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>
最后,几点说明。我不完全确定您是如何使用这些数据的,因此这些建议甚至可能无关紧要。此外,您的代码似乎表明您正在执行查询查询。这也可能不需要(以及其中的 ORDER BY)。您的页面中可能已经有了可用的数据,可以从原始查询数据中提取出来。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。