【发布时间】:2015-04-24 15:31:05
【问题描述】:
我想在 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"
}
]
我想让它变成这样:
{
"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 没有作为引用保存,所以任何东西都被分配给类型..
有什么想法吗?
【问题讨论】:
-
首先,您真的必须在模板中执行此操作吗? FTL 是关于基于某些数据打印文本,而不是关于将集合/映射转换为其他集合/映射。 (按照设计,FTL 甚至没有可修改的集合/映射。)在 Java 或 Groovy 等中执行此操作,但不要在模板中执行此操作,因为它会很丑。
-
您认为我提出的解决方案如何?有什么问题,或者只是不再感兴趣?
标签: hash freemarker