Coldfusion 需要使用分隔符创建字符串数组的树状结构

Coldfusion 需要使用分隔符创建字符串数组的树状结构,coldfusion,Coldfusion,我需要转换一个字符串数组,它是一个以“/”分隔的列表 基本上我需要这个: [ "label1/label12/label13/label14", "label1/label12/label15", "label1/label12/label16", "label7/label72/label73" ] 要得到这样的结果: { "label1": { "label12": { "label13": "label14"

我需要转换一个字符串数组,它是一个以“/”分隔的列表

基本上我需要这个:

[
    "label1/label12/label13/label14",
    "label1/label12/label15",
    "label1/label12/label16",
    "label7/label72/label73"
]
要得到这样的结果:

{
    "label1": {
        "label12": {
            "label13": "label14",
            "label15",
            "label16"
        }
    },
    "label7": {
        "label72": "label73"
    }
}
这有可能吗

编辑:在给出了我的问题的解决方案后,正如我所写的,我现在需要一种方法,甚至可以用“+++In work++”这样的键来完成

编辑2:第二种效果更好。谢谢你们


<cfset arrLabels = [
    "label1/label12/label13/label14",
    "label1/label12/label15",
    "label1/label12/label16",
    "label7/label72/label73"
]>




<cffunction name="labelConversion" returntype="struct">
    <cfargument name="arrLabels" type="array">
    <cfset var structLabels = {} />

    <cfloop from="1" to="#ArrayLen(arguments.arrLabels)#" index="i">
        <cfset StructGet("structLabels."&replace(arguments.arrLabels[i],'/','.', 'all'))>
    </cfloop>

    <cfreturn structLabels />
</cffunction>


<cfdump var="#labelConversion(arrLabels)#">
<cfabort>

此方法也适用于带有特殊字符的键,如“+”或“!”或“+++在工作中++”



您能解释一下为什么label14和label73不是值的键吗?为什么标签73是一个值,而不是标签16或标签15。标签14和标签73是值,因为它们位于链的末端。就像label15和label16一样。它一定和我的建议不完全一样,只是没有太多的重复。ColdFusion的哪个版本?structget函数是我的解决方案的基础,但是你可以为这个解决方案添加更多的健壮性,比如检查列表长度等。叶节点也有一个空的结构,如果需要,您可以很容易地更改它。StructGet的有趣用法。从来没有想过用那种方式。可能会添加一个简短的说明,说明为什么/如何为将来阅读它的其他人工作。这是可行的,但不使用“”或“+”,因为这使用了点符号。尝试了一点[“key”]符号的变通方法,但StructGet似乎只接受数字作为[and]内的键。所以下一个级别是获取自定义字符串作为我的结构的键。。。有什么想法吗?编辑:将您的答案标记为解决方案,因为从技术上讲,您回答的问题是正确的。这并不是说它只接受数字。正如您所说,它使用点符号,这意味着任何键名也必须是,如以字母或下划线开头,不能包含空格、方括号等。。。我认为除了替换无效字符外,没有其他方法可以解决这个问题。。至少对于任何使用点表示法的函数都不需要。您需要编写与StructGet相同的递归函数,才能具有完全的灵活性。这就是我开始做的,直到我觉得简洁更好看。但另一种方法是将唯一标签名的映射结构映射到规范化的唯一结构键,有点像查找表。
<Cfset labels =[
    "label1/label12/label+++13/+++ In work +++",
    "label1/label12/label15",
    "label1/label12$$@!/label16",
    "123/label72/label73"
]>


<cffunction name="convertLabels" returntype="struct">
    <cfargument name="k" type="array">
    <Cfset var local = {}>
    <Cfset local.response = {}>

    <Cfloop from=1 to="#arraylen(arguments.k)#" index="i">
        <Cfset local.splitted = arguments.k[i].Split("/")>
        <cfset local.refPath = local.response>
        <Cfloop from=1 to="#arraylen(local.splitted)#" index="local.y">
            <cfif not structKeyExists(local.refPath,local.splitted[local.y])>
                <Cfset local.refPath[splitted[local.y]] = {}>
            </cfif>
            <Cfset local.refPath = local.refPath[local.splitted[local.y]]>
        </cfloop>
    </cfloop>

    <cfreturn local.response>
</cffunction>
<cfdump var="#convertLabels(labels)#">