Есть ли универсальный движок для перевода объекта 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
},
{},
{},
//...
]
Щас пользуюсь мануалом 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}}
(Это очень мило, потому что усы не позволяют вам сделать это.)
Однако 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}}