Вы можете использовать array.reduce
, чтобы превратить ваш плоский массив в двухмерный массив.
component.ts
// simple array for this example
const source = [1, 2, 3, 4, 5, 6];
this.model = source.reduce((arr, current, idx) => {
const index = Math.floor(idx / 3);
if (arr.length === index) {
arr.push([]);
}
arr[index].push(current);
return arr;
}, []);
компонент . html
<ng-container *ngFor="let group of model; let i = index">
<div *ngFor="let item of group">
{{item}} -- {{i + 1}}
</div>
</ng-container>
Этот простой пример преобразует массив длины 6
[ 1, 2, 3, 4, 5, 6 ]
в двумерный массив длины 2:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ]
]
Как только ваша модель будет в структуре, которая соответствует вашим потребностям, становится легко использовать внешний индекс в качестве счетчика, который увеличивается на 3. Вы даже можете отобразить внешний индекс на новый объект, если вам нужно сделать больше с ним.
Было бы достаточно просто преобразовать это с помощью вашей модели.
Рабочая демонстрация: https://stackblitz.com/edit/angular-c2hcrz
Как это работает?
Я использую первые 3 параметра функции обратного вызова reduce
здесь
(arr, current, idx)
И вызываю reduce
с пустым массивом - второй аргумент.
Думайте о reduce
как map
- он перебирает исходный массив и позволяет вам помещать каждое значение в нужное вам место.
В callbac k:
- arr - это новый массив, который создается и в конечном итоге возвращается.
- current - текущее значение в l oop из исходного массива
- idx - текущий индекс в l oop из исходного массива
Сначала я выясняю, где в новом массиве мы должны добавить текущий индекс, выполнив Math.floor(idx / 3)
. Это позволяет нам увеличивать целевой индекс на 1 каждый третий прирост исходного массива. Все остальное довольно просто javascript.
С объектами
Использовать это с объектами тривиально. Контент здесь не имеет значения, именно индекс в исходном массиве определяет группировку:
const source = [
{ name: 'One', id: 1 },
{ name: 'Two', id: 2 },
{ name: 'Three', id: 3 },
{ name: 'Four', id: 4 },
{ name: 'Five', id: 5 },
{ name: 'Six', id: 6 }
];
this.objModel = source.reduce((arr, current, idx) => {
const index = Math.floor(idx / 3);
if (arr.length === index) {
arr.push([]);
}
arr[index].push(current);
return arr;
}, []);