我正在寻找一种使用模板将大对象转换为自定义对象的通用方法。它应该能够遍历数组的each
值,并在循环中引用父值。
想象一下像这样的对象:
{
collectionId : 432,
products : [
{
productId : 1155,
suppliers : [
{
supplierId : 252,
supplier : 'SupplyCompany',
shipments : [
{
date : 'foo',
order : 'bar',
id : 45
},
{},
{},
//...
]
},
{},
{},
//...
]
},
{},
{},
//...
],
}
我希望将其扁平化为:
[
{
collectionId : 432,
productId : 1155,
supplierId : 252,
supplier : 'SupplyCompany',
date : 'foo',
order : 'bar',
id : 45
},
{},
{},
//...
]
现在我正在使用手动for
for
for
循环,但是当源对象更改或我的某个输出对象发生更改时,这不是非常通用。对这些翻译进行“硬编码”并不是很难维护。
有模板引擎做了类似我想要的事情,例如: JsRender。它理论上允许你做我需要的事情:
{{for products}}
{{for suppliers}}
{{for shipments}}
collectionId : {{:#parent.parent.parent.parent.data.collectionId}}
productId : {{:#parent.parent.parent.data.productId}},
supplierId : {{:#parent.parent.data.supplierId}},
supplier : {{:#parent.parent.data.supplier}},
date : {{:date}},
order : {{:order}},
id : {{:id}
{{/for}}
{{/for}}
{{/for}}
(这很不错,因为Mustache不允许你这样做。)
然而,jsRender读取字符串(模板)和输出字符串(html)。所有stringify
和parse
的开销在我的情况下没有任何好处。
我正在寻找用对象进行这种处理的东西。从对象到对象。
答案 0 :(得分:1)
使用JsRender有几种方法可以做到这一点。例如,创建自定义标签,转换器等(或使用辅助函数)并使它们具有将对象映射到某个输出对象的副作用非常容易。当然,JsRender的哲学通常是声明性的,没有副作用,但如果你愿意,你确实可以使用它作为“处理器”。
这是jsfiddle sample,它可以为您提供一些想法:
它使用自定义标记:
$.views.tags({
addObject: function(target) {
var item = $.extend({}, this.tagCtx.props);
target.push(item);
...
}
})
和模板:
{{for products ~collectionId=collectionId}}
{{for suppliers ~productId=productId}}
{{for shipments ~supplierId=supplierId ~supplier=supplier}}
{{addObject ~target collectionId=~collectionId productId=~productId supplierId=~supplierId supplier=~supplier date=date order=order id=id/}}
{{/for}}
{{/for}}
{{/for}}