как группировать и сортировать объекты массива

#arrays #angular #typescript #sorting #group-by

#массивы #angular #typescript #сортировка #группировать по

Вопрос:

Я пишу приложение на 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> 
 

Каков наилучший способ группировки и сортировки, а затем просмотра?

Комментарии:

1. Как вы хотите, чтобы выглядела конечная структура данных?

Ответ №1:

На вашем месте (и если я правильно понял) я бы сгруппировал элементы с помощью .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.log(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>
 

Вы можете увидеть пример здесь

Комментарии:

1. Как я могу добавить больше полей в заголовок группы? Если, например, я также хочу отобразить порядок здесь: <span>{{e[0]}} {{порядок также здесь ???}}</span>