我想在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不作为参考保存,因此任何东西都被归为类型.
有任何想法吗?
虽然我同意@ 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)