Reputation: 19
I have a list that has three columns (menu, item menu, and order ) and I want to display the menu item for every menu by order, but I have a problem with the new list, I can't have the menu item for every menu, How to display it like in the picture:
list1 = [];
list2 = [];
list3 = [];
const list1 = [
{ menu: 1, order: 200 },
{ menu: 2, order: 230 },
{ menu: 3, order: 250 },
];
const list2 = [
{ item: 1, order: 210 },
{ item: 2, order: 360 },
];
let list3 = [];
for (let i = 0; i < list1.length; i++) {
const next = i + 1;
if (next <= list1.length - 1) {
let nextMenu = list1[next].order;
for (let j = 0; j < list2.length; j++) {
let item = list2[j].order;
let menu = list1[i].order;
if (menu < item && item < nextMenu) {
list3.push(list2[j]);
}
}
} else {
for (let j = 0; j < list2.length; j++) {
let item = list2[j].order;
let menu = list1[i].order;
if (menu < item) {
list3.push(list2[j]);
}
}
}
}
this.list1 = list1;
this.list2 = list2;
this.list3 = list3;
}
HTML:
<ul>
<li *ngFor="let menu of list1">
{{ 'Menu ' + menu.menu + ' : order ' + menu.order }}
</li>
<li *ngFor="let item of list3">
{{ 'Menu item ' + item.item + ' : order ' + item.order }}
</li>
</ul>
MY CURRENT VIEW:
Upvotes: 0
Views: 675
Reputation: 7406
You have order so you just need to join these arrays and sort them and then show them on basis of being item or menu:
export class AppComponent {
finalList = [];
constructor() {
const list1 = [
{ menu: 1, order: 200 },
{ menu: 2, order: 230 },
{ menu: 3, order: 250 },
];
const list2 = [
{ item: 1, order: 210 },
{ item: 2, order: 360 },
];
let list3 = [];
[...list1, ...list2, ...list3].sort((a, b) => a.order - b.order).forEach((item) => {
if (item.menu) {
this.finalList.push({
menu: item.menu,
order: item.order,
items: []
});
}
if (item.item) {
this.finalList[this.finalList.length - 1]?.items?.push({
order: item.order,
item: item.item
});
}
});
}
}
Template:
<ng-container *ngFor="let menu of finalList">
<span>
{{ 'Menu ' + menu.menu + ' : order ' + menu.order }}
<br>
</span>
<ng-container *ngIf="menu.items.length">
<ul>
<li *ngFor="let item of menu.items">
{{ 'Menu item ' + item.item + ' : order ' + item.order }}
</li>
</ul>
</ng-container>
</ng-container>
I provided a stackblitz for you too.
Upvotes: 1