0
votes

angulaire supprimer les doublons dans un observable

Dans cette option de tapis, j'essaye d'afficher les données d'un observable auquel je suis abonné.

public filterCity() {
 var parameters = new CitySearchParameters(100, 0);
 parameters.City = this.city;    
 this.filteredCustomer = this.customerService.get(parameters);
 if (typeof (this.city) == "object") {
  var curCity: any = this.city;
  this.city = curCity.City;
 }
}

Le nom de l'observable est filteredCustomer.

Maintenant, dans l'option mat, j'essaye d'afficher les noms de villes. C'est le résultat.

Los Angeles
Boston
Detroit
Los Angeles
Washington
Los Angeles

Comme vous pouvez le voir, j'ai des doublons.

Il est possible de supprimer les doublons (comme un distinct dans SQL)?

Mon observable provient de ce fichier ts:

   <mat-option *ngFor="let option of (filteredCustomer | async)?.Items"
   [value]="option" (onSelectionChange)="searchDest($event)">
   {{option.Cityname}} 
   </mat-option>

Merci


1 commentaires

Quelle est l'attente de production? est juste une liste de chaînes?


3 Réponses :


0
votes

L'objet Set vous permet de stocker des valeurs uniques de tout type, qu'il s'agisse de valeurs primitives ou de références d'objet.

Ainsi, vous pouvez convertir la liste, les doublons seront supprimés.

let chars = ['A', 'B', 'A', 'C', 'B'];

let uniqueChars = chars.filter((c, index) => {
    return chars.indexOf(c) === index;
});

console.log(uniqueChars); // results = [ 'A', 'B', 'C' ]

une autre approche pour utiliser le filtre

    let list = [...new Set(this.filteredCustomer)];


2 commentaires

avec la méthode Set, j'ai cette erreur: aucune surcharge ne correspond à cet appel. Surcharge 1 sur 2, '(iterable ?: Iterable <inconnu>): Set <inconnu>', a donné l'erreur suivante. L'argument de type 'Observable <CustomerSearchResult>' n'est pas assignable au paramètre de type 'Iterable <unknown>'. La propriété '[Symbol.iterator]' est manquante dans le type 'Observable <CustomerSearchResult>' mais requise dans le type 'Iterable <unknown>'. Surcharge 2 sur 2, '(valeurs?: Lecture seule n'importe quel []): Définir <any>', a donné l'erreur suivante. L'argument de type 'Observable <CustomerSearchResult>' n'est pas assignable au paramètre de type 'readonly any []'.


wsvincent.com/javascript-remove-duplicates-array/… .



0
votes

Vous pouvez utiliser l'opérateur de réduction RxJS pour que votre canal asynchrone fonctionne, quelque chose comme ceci, en supposant que vous supprimez les doublons en fonction de la propriété .Cityname

public filterCity() {
  var parameters = new CitySearchParameters(100, 0);
  parameters.City = this.city;
  this.filteredCustomer = this.customerService.get(parameters).pipe(
    reduce((list, val) => {
      if (!list.length) return [val]
      const foundIndex = list.findIndex((item) => item.cityname === val.cityname);
      if (foundIndex === -1) {
        list.push(val);
      }

      return list;
    }, [])
  );
  if (typeof(this.city) == "object") {
    var curCity: any = this.city;
    this.city = curCity.City;
  }
}


0 commentaires

0
votes

Vous pouvez utiliser Array#filter avec Array#findIndex pour supprimer les doublons dans un tableau.

public filterCity() {
  var parameters = new CitySearchParameters(100, 0);
  parameters.City = this.city;
  this.filteredCustomer = this.customerService.get(parameters).pipe(
    map(customer => ({
      ...customer,
      Items: uniqueArray(customer.Items, 'Cityname')  // <-- remove duplicates by `Cityname` property
    }))
  );
  if (typeof (this.city) == "object") {
    var curCity: any = this.city;
    this.city = curCity.City;
  }
}

Vous pouvez ensuite "capturer" l'émission de l'observable dans le contrôleur à l'aide de l'opérateur de map et supprimer les doublons avant de les rendre dans le modèle

// credit: https://stackoverflow.com/a/36744732/6513921
private uniqueArray(target: Array<any>, property: any): Array<any> {
  return target.filter((item, index) =>
    index === target.findIndex(t => 
      t[property] === item[property]
    )
  );
}

L'opérateur de propagation ... est utilisé pour conserver d'autres propriétés dans l'émission de l'observable, à l'exception du tableau de propriétés Items . Il est modifié pour supprimer les doublons.


2 commentaires

Ça fonctionne bien. De cette façon, j'ai une méthode dédiée (celle que vous avez appelée uniqueArray) qui sera utile à l'avenir. Merci beaucoup.


Je ne peux pas voter en raison de ma réputation. Merci beaucoup.