是否有一个多功能引擎将JavaScript对象转换为不同的对象?

时间:2015-10-11 16:29:42

标签: templates object datatemplate jsrender jsviews

我正在寻找一种使用模板将大对象转换为自定义对象的通用方法。它应该能够遍历数组的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)。所有stringifyparse的开销在我的情况下没有任何好处。

我正在寻找用对象进行这种处理的东西。从对象到对象。

1 个答案:

答案 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}}