Я пишу приложение на TypeScript Я использую массив JSON, например:
data = [{"name":"dog",
"line":1,
"order":1},
{"name":"cet",
"line":1,
"order":2},
{"name":"red",
"line":2,
"order":1},
{"name":"green",
"line":2,
"order":2},
{"name":"elephant",
"line":1,
"order":3}]
Я хочу сгруппировать массив по «строке» и отсортировать по возрастанию и каждый объект в «строке» сортируется по «порядку» и отображается на HTML-странице таким образом, чтобы каждая «строка» находилась в отдельной строке.
<div *ngFor = "let d of data" >
<div *ngFor = "" class= "row">
<span >{{d.name}}</span>
<div>
<div>
Как лучше всего сгруппировать и отсортировать, а затем просмотреть?
На вашем месте (и если я правильно понял) я бы сгруппировал элементы с помощью метода .reduce(), затем отсортировал каждый из полученных массивов и в конце создал массив элементов для перебора.
Группировка и сортировка могут выглядеть следующим образом:
const data = [{"name":"dog", "line":1, "order":1},
{"name":"cet", "line":1, "order":2},
{"name":"red", "line":2, "order":1},
{"name":"green", "line":2, "order":2},
{"name":"elephant", "line":1, "order":3}];
const grouped = data.reduce((res, curr) => {
res[curr.line] = res[curr.line] || [];
res[curr.line].push(curr);
return res;
}, {});
for (const group of Object.values(grouped)) {
group.sort((a, b) => a.order - b.order);
}
const entries = Object.entries(grouped);
console.info(entries);
И в вашем шаблоне повторите entries:
<div *ngFor = "let e of entries" >
<div *ngFor = "let group of e[1]" class= "row">
<span>{{group.name}}</span>
</div>
<span>{{e[0]}}</span>
</div>
Пример можно посмотреть здесь
Как добавить больше полей в заголовок группы? Если, например, я также хочу отобразить заказ здесь: <span>{{e[0]}} {{заказ также здесь???}}</span>
Как вы хотите, чтобы конечная структура данных выглядела?