Hash 为freemarker中的哈希内部的哈希分配键
我想在freemarker中创建一个现有模型的新模型,使其易于使用 我的模型是这样的:Hash 为freemarker中的哈希内部的哈希分配键,hash,freemarker,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": "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"
}
]
{
"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"
}
}
我想把它做成这样:
[
{
"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"
}
]
{
"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"
}
}
您可能知道,在freemarker中为哈希分配一个键有点奇怪
我所做的是:
<#assign preferencesByCode = {} />
<#list preferences as preference>
<assign preferencesByCode = preferencesByCode + {preference.type : { preference.code: preference.id } } />
</#list>
但是这样做,它只保留最后一个id,所以我只有一种类型
于是我尝试了这个:
<#if !(preferencesByCode[preference.type])??>
<#assign preferencesByCode = preferencesByCode + {preference.type : { } } />
</#if>
<#assign subHash = preferencesByCode[preference.type] />
<#assign subHash = subHash + {preference.code : preference.id } />
但是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)>
一个freemarker函数,从某个
路径中的根对象返回最后一个散列值
<#function deepHash obj path>
<#assign hashes = path?split(".")>
<#assign value = obj/>
<#list hashes as hash>
<#assign value = value[hash]!/>
</#list>
<#if value?is_boolean>
<#return value?c>
<#else>
<#return value>
</#if>
</#function>
首先,您真的必须在模板中执行此操作吗?FTL是基于某些数据打印文本,而不是将集合/地图转换为其他集合/地图。(根据设计,FTL甚至没有可修改的集合/映射。)在Java或Groovy等中这样做,但不要在模板中这样做,因为这样会很难看。你认为我提出的解决方案如何?有什么问题吗,或者只是不再感兴趣了?我没想到!太棒了。当然,您可能知道,我决定用Java来解析它,以便按照我的要求传递模型。不管怎样,这就是我当时想要的!感谢您返回并接受答案,尽管您已经以不同的方式解决了问题!