Coldfusion Structinsert 正在覆盖原始插入值

Coldfusion Structinsert is overwriting the orignal inserted values

我有以下代码。

<cfset x = StructNew()>
<cfset y = StructNew()>

<cfset y.name = "1">
<cfset y.id = "2">

<cfset structInsert(x,"item1",y)>

<cfdump var="#x#">

这将输出以下内容,这是我所期望的。

struct
item1 struct
      name  1
      id    2

然后我添加这段代码来插入另一组数据。

<cfset y.name = "3">
<cfset y.id = "4">

<cfset structInsert(x,"item2",y)>

<cfdump var="#x#">

这将输出以下内容。

struct
item1 struct
      name  3
      id    4
item2 struct
      name  3
      id    4

为什么item1数据变了?

从技术上讲,structInsert 不会覆盖值 - 你是 - 当你这样做时:

 <cfset y.name = "3">
 <cfset y.id = "4">

 <!--- show values before structInsert --->
 <cfdump var="#x#">

(注意转储显示 item1 数据已经更改,甚至 再次调用 structureInsert 之前?)

原因是结构被传递by reference。意思是 x.item1 只是指向 y 结构的 指针 ,而不是一个独立的副本。因此,当代码更新 y.namey.id 的值时,这些更改也会自动反映在 x.item1 中。

如果你想让y结构完全独立,要么先创建一个new结构(或者用duplicate()深拷贝) .

<cfset y = structNew()>
<cfset y.name = "3">
<cfset y.id = "4">

话虽如此,除非有使用 structInsert() 的特定原因,否则现在使用结构或点表示法更为标准:

 <cfset x.item1 = y> ... or
 <cfset x["item1"] = y>

此外,您可以通过使用快捷语法 {} 来创建 and/or 填充结构,从而大大减少代码。这是一行中的整个示例:

<cfset x = { "item1": {"name": "1", "id": "2"}
        , "item2": {"name": "3", "id": "4"}
       }>

... 或者如果您需要单独附加结构,请使用:

<cfset x = {}>
<cfset x["item1"] = {"name": "1", "id": "2"}>
<cfset x["item2"] = {"name": "3", "id": "4"}>