【问题标题】:Loop over array of structures and output specific struct value?循环结构数组并输出特定的结构值?
【发布时间】:2018-12-05 18:27:39
【问题描述】:

我有一系列结构,我应该在其中访问特定字段。这是我的数据示例:

array
1   
   struct
   address_city     Washington
   address_state    DC
array
2   
   struct
   address_city     New York
   address_state    NY
array
3   
   struct
   address_city     Miami
   address_state    FL

我有这段代码循环遍历数组,然后内部循环遍历结构:

<cfloop from="1" to="#arrayLen(arrData)#" index="i">
    <cfset data = arrData[i]>
    <cfloop collection="#data#" item="key">
        <cfoutput>#key#:#data[key]#<br></cfoutput>
    </cfloop> 
</cfloop>

上面的代码会产生这个输出:

address_city:Washington
address_state:DC
address_city:New York
address_state:NY
address_city:Miami
address_state:FL

相反,我只需要访问 address_state 值。我尝试过这样的事情:

<cfloop from="1" to="#arrayLen(arrData)#" index="i">
    <cfset data = arrData[i]>
    <cfloop collection="#data#" item="key">
        <cfoutput>#data[key]['address_state']#<br></cfoutput>
    </cfloop> 
</cfloop>

然后我收到此错误消息:

Message     You have attempted to dereference a scalar variable of type class java.lang.String as a structure with members. 

有没有办法从数组中的每个结构中只输出一个字段?当迭代 JS 对象时,类似的事情在 JavaScript 中是可行的。示例:

for (var key in data) {
    console.log(data[key]['address_state']);
}

如果有人知道在 ColdFusion 中实现此目的的方法,请告诉我。

【问题讨论】:

  • 只做#data['address_state']#
  • @CFML_Developer 你试过那个代码吗?这不是正确的输出。它将这样做:DC DC NY NY FL FL 它将为结构中的每个项目输出状态值。
  • 也许投反对票的人可以解释投反对票。我看不出这个问题有什么问题。

标签: arrays data-structures coldfusion coldfusion-10 cfloop


【解决方案1】:

很有趣,有一种方法几乎与 JS 示例完全一样。

for (key in data) {
    writeOutput( "Address State = " & key.address_state & "<br>");
}

https://trycf.com/gist/f0bd28bbf644912d320b10fdc5f526f4/acf?theme=monokai

您收到错误是因为您在不需要时引用了 data 数组。根据循环的性质,您已经在 data 中循环了 keys。在您的脚本示例中,您不需要对数组进行双循环。

【讨论】:

  • 我使用 ColdFusion 10 不确定是否受支持。至少当我尝试时,我得到了与上面提到的相同的错误。
  • Adobe CF10? TryCF.com 链接在 ColdFusion 10 中。它应该可以工作。您是否尝试过我包含的确切代码示例?它不应该给你这样的错误。
  • @espresso_coffee 你能用 TryCF 创建你的数据结构吗?它是一个包含数据结构的数组吗?或者它是一个包含其他数组的数组,该数组包含结构数据?
  • 它工作!仅当我使用cfscript 时才够有趣,如果我尝试使用cfml 来执行此操作,则会出现错误。
  • @espresso_coffee 你不应该循环查询。这将导致大量不必要的网络活动,并且重新连接每个循环将导致大量延迟。您最好编写一个可以在一次调用中获得多个结果或执行多个插入的查询。你用的是什么数据库?
【解决方案2】:

我已经解决了您的问题,希望您根据基于脚本的编码风格得到答案。但是正如您在上面的 cmets 中所说,您需要基于标签的功能。所以在这里我发布了基于标签的功能。我希望它会帮助你。谢谢。

<cfloop array ="#arrData#" index="data">
    Address_State: #data.address_state# <br>
</cfloop>

【讨论】:

  • 只是一个注释,但我没有看到 OP 说他必须使用标签。无论如何,即使它是 CF10,我仍然建议在任何可能的地方使用脚本(接近 10 中的所有内容)。我认为 CF 的标签性是它受到抨击的原因之一(尽管它也可以使它易于学习/使用)。但指出数组循环更合适是这里的一大关键。
猜你喜欢
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 2021-03-20
  • 2016-03-23
  • 1970-01-01
相关资源
最近更新 更多