首页 > 解决方案 > 试图用另一组结构包装一个结构

问题描述

我正在尝试用另一个结构包装一个结构,但我肯定错过了一些东西

我想这样展示

account: {
    "name": "Example Account",
    "details": "https://www.example.com"
  }

我正在尝试这个功能,但我错过了一些东西,可能我应该使用 structmap,不确定

<cffunction name="SO">
    <cfargument name="name" required="true" type="struct">
    <cfargument name="data" required="true" type="struct">
    <cfloop collection="#arguments.Data#" index="i">
        <cfset arguments.Name['#lcase(i)#'] = arguments.Data[i]>
    </cfloop>   
    <cfreturn arguments.Name>
</cffunction>

标签: structcoldfusionlucee

解决方案


当我第一次看到这个时,我以为你本质上想要一个新的结构,它有一个“名称”(包含一个字符串)和一个包含一个结构的“数据”。

您的初始设置基本上是

<cfset name = "Test" >
<cfset data = { details: "detail1" , details2: "detail2" } >

在处理 CF 中的大多数数据结构时,我通常发现使用 CFSCRIPT 而不是标签更容易和更清晰。所以我想出了

<cfscript>
    function SO ( required String name, required Struct data ) {
        var retval = { name:"",data:{} } ;

        retval.name = arguments.name ;

        arguments.data.map( function(key, val) {
            retval.data[key.lcase()] = val ;
        } ) ;

        return retval;
    }

    writedump( SO(name,data) ) ;
</cfscript>

试图解开这一点,您似乎要做的就是向您的“数据”结构添加一个“名称”值。这可以很容易地完成

<cffunction name="SO_tags">
    <cfargument name="name" required="true" type="string">
    <cfargument name="data" required="true" type="struct">

    <cfset retval2 = arguments.data >
    <cfset retval2.name = arguments.name>
    <cfreturn retval2>
</cffunction>

<cfset structure = {"account":SO_tags(name,data)}>
<cfdump var = #structure#>

或者使用脚本,它可以归结为一行。

<cfscript>
    function SO3 ( required String name, required Struct data ) {
        return arguments.data.append( {"name":arguments.name} ) ;
    }

writedump( {"account":SO3(name,data)} ) ;
</cfscript>

根据它如何适合您的代码的其余部分,您甚至可能不需要函数。

https://cffiddle.org/app/file?filepath=b6e92a83-ebc9-40eb-a712-f402d7f9ed85/f4fb9f8e-3b60-4a64-8c02-2cd106736df0/4e00abae-b949-4934-86e8-870745259127.cfm

编辑:更改输出以将其嵌套在“帐户”结构中。


推荐阅读