Quiero eliminar los valores duplicados en la lista observable. ¡Solo en plantilla, sin cambiar componente!
Usando el índice, quiero eliminar valores duplicados en doble * ngFor.
¿Hay alguna manera?
<div class="order-list-row" *ngFor="let list of sandbox.orderList$ | async;"> <div class="olr-header flex"> <div class="olrh-lft flex"> <div class="olrh-lft-col"> <h5>주문코드</h5> <p>{{list.orderPrefixId}}</p>Quiero saltarme los valores(list.orderPrefixId) que ya han sido impresos aplicando una condición(usando index)
Podría usar una directiva o, mejor aún, una lógica como esta está destinada a permanecer en su archivo de componentes. Hacer este tipo de filtrado en su archivo de plantilla es un mal diseño en sí mismo.
Suscríbase al observable en su archivo de componente y realice su filtrado allí
Me doy cuenta de que pidió una solución en la plantilla, pero le daré 2 soluciones sensatas. Uno de los cuales no está realmente en la plantilla, pero también conserva el observable original:
obs$: Observable<number[]> = of([1, 2, 3, 3, 4, 4, 4, 5]); filteredObs$ = this.obs$.pipe( map((arr) => { return new Set(arr); }) );En plantilla:
<p *ngFor="let n of filteredObs$ | async"> {{ n }} </p>Si desea que el filtrado se realice en la plantilla , puede crear una función:
filterArray(arr: number[]): number[] { return Array.from(new Set(arr)); }En plantilla:
<p *ngFor="let n of filterArray(obs$! | async)"> {{ n }} </p>Solo usé un número [] en este ejemplo, pero la idea es la misma para los objetos, el mapeo sería un poco más complejo. Hay muchos ejemplos de eso en la red, pero si necesita ayuda con eso, solo pregunte.
Aquí está mi ejemplo en un StackBlitz .
Realmente el mejor enfoque es crear un nuevo observable con los valores únicos
si su sandbox.orderList$ regresa, por ejemplo, a algunos les gusta
[{id:0},{id:1},{id:2},{id:2},{id:3},{id:0},...]Puedes definir
orderListUnique$=this.sandbox.orderList$.pipe( map((res:any[],i:number)=> res.reduce((a,b)=>a.find(x=>x.id==b.id)?a:[...a,b],[]) )) Y use orderListUnique$ |async
solo por diversión
Si tu lista está ordenada puedes escribir algún "bizarro" como
<ng-container *ngIf="{ values: values$ | async } as values"> <ng-container *ngFor="let value of values.values; let i = index"> <ng-container *ngIf="i == 0 ? null : '' + values.values[i - 1].id as old"> <p *ngIf="value.id != old"> {{ value.id }} </p> </ng-container> </ng-container> </ng-container>Si su lista no está ordenada, necesita tener una matriz con la clave para ordenar, por ejemplo, si tiene una variable "indexValues"
obs$=observable.pipe( tap((res:any[])=>this.indexValues=res.map(x=>x.id)))Y use
<ng-container *ngFor="let value of objValues$ | async; let i = index"> <ng-container *ngIf="indexValues.indexOf(value.id) == i"> <p> {{ value.id }} </p> </ng-container> </ng-container>Puedes ver el enfoque en este stackblitz