Новый для angularjs и ищет некоторые советы. Мы подключили наш угловой интерфейс к REST API, который выплескивает json назад, например:
[
{
"category_id":"1",
"category_name":"dog",
"subcategories":[
{
"category_id":"4",
"parent_id":"1",
"category_name":"Sporting",
},
{
"category_id":"5",
"parent_id":"1",
"category_name":"Hunter",
},
{
"category_id":"6",
"parent_id":"1",
"category_name":"Lap",
}
]
},
{
"category_id":"2",
"category_name":"feline",
"subcategories":[
{
"category_id":"8",
"parent_id":"2",
"category_name":"Black",
},
{
"category_id":"9",
"parent_id":"2",
"category_name":"White",
},
{
"category_id":"10",
"parent_id":"2",
"category_name":"Domestic",
}
]
}
]
Мы пытаемся отображать каждую категорию и их подкатегории в виде строк в таблице. Мы пытаемся использовать ng-repeat, но при использовании таблиц он определенно не любит вложенные массивы.
Мы взломали что-то подобное:
<tr ng-repeat-start="cat in category">
<td>{{cat.category_id}}</td>
<td>{{cat.category_name}}</td>
</tr>
<tr ng-repeat-start="subcat in cat.subcategories">
<td>{{subcat.category_id}}</td>
<td>{{subcat.category_name}}</td>
</tr>
<tr ng-repeat-end></tr>
<tr ng-repeat-end></tr>
То, что мы хотели бы сделать, это использовать функции datatable (угловые-datatables.min.js) для наших таблиц, что означает, что нам нужно сгладить наш наш json, чтобы подкатегории находились на одном уровне с категориями и все в одном массиве вместо подмассивов.
Кто-нибудь знает "хороший" способ достичь этого?
Спасибо заранее за любую помощь.
Это результат, который вы ищете?
http://plnkr.co/edit/5HN8I5KlT7X73qtjG44B?p=preview
<table border="1">
<tr ng-repeat="animal in animals">
<td>{{animal.category_id}}</td>
<td>{{animal.category_name}}</td>
<td>
<table>
<tr ng-repeat="subcat in animal.subcategories">
<td>{{subcat.category_id}}</td>
<td>{{subcat.category_name}}</td>
</tr>
</table>
</td>
</tr>
</table>
Использование Array.prototype.reduce()
.
var res= data.reduce(function(p, c, i){
// push new parent object into array
p.push({category_id : c.category_id, category_name : c.category_name}) ;
// concat subcategories with previous array
return p.concat(c.subcategories);
},[]);
Если структура каждого элемента значительно больше, можно заменить внутренний push()
на:
var cat = angular.copy(c);
delete cat.subcategories;
p.push(cat);