在freemarker中为散列内的散列分配键

Pab*_*mez 3 hash freemarker

我想在freemarker中创建一个现有模型的新模型,以便于使用.

我的模型是这样的:

[
    {
        "id": "1",
        "type": "TYPE_1",
        "code": "CODE_OF_TYPE_1"
    },
    {
        "id": "2",
        "type": "TYPE_1",
        "code": "ANOTHER_CODE_OF_TYPE_1"
    },
    {
        "id": "3",
        "type": "TYPE_2",
        "code": "CODE_OF_TYPE_2"
    },
    {
        "id": "4",
        "type": "TYPE_2",
        "code": "ANOTHER_CODE_OF_TYPE_2"
    }
]
Run Code Online (Sandbox Code Playgroud)

我想做到这样的事情:

 {
    "TYPE_1": {
        "CODE_OF_TYPE_1": "1",
        "ANOTHER_CODE_OF_TYPE_1": "2"
    },
    "TYPE_2": {
        "CODE_OF_TYPE_2": "3",
        "ANOTHER_CODE_OF_TYPE_2": "4"
    }
}
Run Code Online (Sandbox Code Playgroud)

您可能知道,在freemarker中为哈希分配密钥有点奇怪..

我做的是这样的:

<#assign preferencesByCode = {} />

<#list preferences as preference>
    <assign preferencesByCode = preferencesByCode + {preference.type : { preference.code: preference.id } } />
</#list>
Run Code Online (Sandbox Code Playgroud)

但这样做,它只保留最后一个id,所以我只有一种类型..

那么我试过这个:

<#if !(preferencesByCode[preference.type])??>
    <#assign preferencesByCode = preferencesByCode + {preference.type : { } } />
</#if>

<#assign subHash = preferencesByCode[preference.type] />
<#assign subHash = subHash + {preference.code : preference.id } />
Run Code Online (Sandbox Code Playgroud)

但是subHash不作为参考保存,因此任何东西都被归为类型.

有任何想法吗?

Yet*_*ank 6

虽然我同意@ ddekany的评论,但这是一个解决您问题的方法.

<#function filterList list type>
  <#local result={}>
  <#list list as preference>
    <#if preference.type == type>
      <#local result=result + {
        preference.code: preference.id
      }>
    </#if>
  </#list>
  <#return result>
</#function>

<#function convertList list>
  <#local result={}>
  <#list list as preference>
    <#if !result[preference.type]??>
      <#local result=result + { preference.type: filterList(list, preference.type) }>
    </#if>
  </#list>
  <#return result>
</#function>

<#assign transformedModel=convertList(model)>
Run Code Online (Sandbox Code Playgroud)