Reputation: 65
I am struggling on a problem.
I receive an array of objects from a get request. Beacause of business logic constraint I can't modify the controller's function that populates my array. So I must eliminate duplicates in my application.
So here is the code :
this.httpClient.get(environment.apiUrl + this.config.getSettings()['cleard']['api']['user']['distribution-zone'], { headers: new HttpHeaders({ 'Authorization': 'BEARER ' + this.auth.getUserSession().access_token })}).subscribe( (arrayDistributionZoneResult: Array<DistributionZoneResult>) => {
console.log('distribution zone result : ' + arrayDistributionZoneResult.length);
let filteredArray: Array<DistributionZoneResult>;
for (const obj of arrayDistributionZoneResult) {
// here i want to add only object whose property distributionZoneId doesn't exist already in my this.distributionZone new array.
this.distributionZone.push(obj.distributionZoneId);
}
My object : DistributionZoneResult is made of 4 properties.
export interface DistributionZoneResult {
distributionZoneName: string;
localisedDistributionZoneName: string;
distributionZoneId: number;
businessUnitId: number;
}
I need to eliminate 'distributionZoneId' duplicate.
As I am new on angular 6 and rxjs, I have looked for solutions on internet, but none of them solved my problem.
first solution I've tried :
this.distributionZone = this.distributionZone.filter((el, i, a) => i === a.indexOf(el));
This one doesn't make any change to my array.
Second solution I've tried :
merge(arrayDistributionZoneResult).distinct((x) => x.distributionZone).subscribe(y => {
filteredArray.push(y);
console.log(filteredArray);
});
I can't use this one because i receive an error on the distinct() function :
error TS2339: Property 'distinct' does not exist on type Observable
So I am kind of lost, because this should't be so hard to just remove duplicate items when these have a particular simililtude. In C# I would do .dinstinct().
Thank you for your expertise. My regards.
here is the solution :
this.httpClient.get(environment.apiUrl + this.config.getSettings()['cleard']['api']['user']['distribution-zone'], { headers: new HttpHeaders({ 'Authorization': 'BEARER ' + this.auth.getUserSession().access_token })}).subscribe( (arrayDistributionZoneResult: Array<DistributionZoneResult>) => {
console.log(environment.apiUrl);
console.log('unfiltered distribution zone result : ' + arrayDistributionZoneResult.length);
for (const obj of arrayDistributionZoneResult) {
this.distributionZone.push(obj.distributionZoneId);
// console.log('arrayDistribZone : ' + obj.distributionZoneId);
}
const distinct = (value, index , self) => {
return self.indexOf(value) === index;
};
this.distributionZone = this.distributionZone.filter(distinct);
console.log('filtered distribution zone result : ' + this.distributionZone.length);
console.log('filtered distribution zone result : ' + this.distributionZone);
});
To use a delegate, and apply the filter on an array of number. Thanks to all of you.
Upvotes: 1
Views: 2009
Reputation: 3821
Rxjs way
from(arrayDistributionZoneResult)
.pipe(
distinct(v=>v.distributionZoneId)
)
...
Upvotes: 1