Есть ли универсальный движок для перевода объекта JavaScript в другой объект?

Я ищу универсальный способ перевести большой объект в пользовательский объект с помощью шаблона. Это должно быть в состоянии пройти 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
    },
    {},
    {},
    //...
]

Щас пользуюсь мануалом forforfor циклы, но это не очень универсально, когда изменяется исходный объект или один из моих выходных объектов. "Жестко кодировать" эти переводы не очень удобно.

Есть движки шаблонов, которые делают что-то похожее на то, что я хочу, например, 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}}

(Это очень мило, потому что усы не позволяют вам сделать это.)

Однако jsRender читает строки (шаблоны) и выходные строки (html). Накладные расходы от всех stringify а также parse не приносит никакой пользы в моем случае.

Я ищу что-то, что выполняет такую ​​обработку объектов. От объектов к объектам.

1 ответ

Решение

Есть несколько способов сделать это с помощью JsRender. Например, действительно легко создавать пользовательские теги, конвертеры и т. Д. (Или использовать вспомогательные функции) и создавать для них побочные эффекты отображения объектов на некоторый выходной объект. Конечно, философия JsRender, как правило, должна быть декларативной, без побочных эффектов, но если вы хотите, вы действительно можете использовать ее как "процессор".

Вот пример jsfiddle, который может дать вам несколько идей:

Он использует пользовательский тег:

$.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}}
Другие вопросы по тегам