Reputation: 1019
I am trying to implement pipes using Angular. Below is the code I have tried. I want to retrieve unique for the complete list . So i have added a pipe filter name for the inner list . But i am still getting the duplicate elements. I have added the json for reference .The inner ArticleTags array has a list of objects. Similarly I have multiple ArticleTags array for every parent Array. I want to retrieve the unique elements from the entire list ArticleTags array. I think its retrieving the unique elements within the particular inner list and not retrieving from the entire list of Article Tags.
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'filterUnique',
pure: false
})
export class FilterPipe implements PipeTransform {
transform(value: any, args?: any): any {
// Remove the duplicate elements
const uniqueArray = value.filter(function (el, index, array) {
return array.indexOf (el) === index;
});
return uniqueArray;
}
}
<ul>
<li *ngFor="let articlesResult of articlesListArray; let i=index">
<ul>
<li *ngFor="let articlesTagResult of articlesResult.ArticleTags | filterUnique; let j=index">
<i class="fa fa-times-circle" *ngIf="articlesResult.ArticleTags[j].value"></i>
<label class="form-check-label" for="exampleCheck" *ngIf="articlesResult.ArticleTags[j].value">{{articlesResult.ArticleTags[j].value}}</label>
</li>
</ul>
</li>
</ul>
getLatestArticles(currdate): void {
this.ng4LoadingSpinnerService.show();
this.ArticlesServiceCall.getArticlesDashboard(currdate)
.subscribe(
resultArray => {
this.ng4LoadingSpinnerService.hide();
this.articlesList = resultArray;
this.articlesLists = resultArray.ResponseValue;
this.articlesListArray = this.articlesLists.slice(0, 8);
},
error => console.log('Error :: ' + error)
);
}
I am getting the main array data from articlesListArray and passing that in html
Edit update on July 09 2018
Getting the below error with the below pipe code.
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({ name: 'filterduplicates' }) export class FilterduplicatesPipe implements PipeTransform {
transform(value: any, args?: any): any {
// Remove the duplicate elements
const art = value.map( x => {
return x.ArticleTags ? x.ArticleTags.map(y => {
return y.value ? y.value : null;
}) : [];
}).reduce((acc, ele, i) => {
acc = acc.concat(ele);
return acc;
}).filter( z => {
if (z) {
return z;
}
});
return new Set(art);
}
Upvotes: 2
Views: 15165
Reputation: 2677
Assuming your article[] is like so:
articles = [
{
ArticleTitle: 'article one',
ArticleTags: [
{key:0, value:'Back'},
{key:1, value:'Shoulder'},
{key:2, value:'Injury'},
{key:3, value:'Abs'}]
},
{
ArticleTitle: 'article two',
ArticleTags: [
{key:3, value:'Abs'},
{key:1, value:'Shoulder'},
{key:4, value:'Leg'},
{key:5, value:'Others'}]}
]
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'filterUnique',
pure: false
})
export class FilterPipe implements PipeTransform {
transform(value: any, args?: any): any {
// Remove the duplicate elements
var art = value.map(x=>{
return x.ArticleTags.map(y=>{ return y.value;});;
}).reduce((acc,ele,i)=>{
acc = acc.concat(ele);
return acc;
});
return new Set(art);
}
}
above pipe returns a set of string containing the value of articletag.
<ul>
<li *ngFor="let a of articles | filterUnique">{{a}}</li>
</ul>
Upvotes: 2
Reputation: 2986
First import into module
`import { FilterPipe} from 'your-custom-pipe-path';`
then You should inject custom pipe in
@NgModule({
declarations: [
FilterPipe
]
})
Rest of code is fine. hope this will help you.
Upvotes: 0
Reputation: 378
Refere this there unique filter is given https://www.npmjs.com/package/ng2-pipes
ex: array | unique: 'Property (Optional)'
this.items = [1, 2, 3, 1, 2, 3];
<li *ngFor="let item of items | unique"> <!-- Array: [1, 2, 3] -->
Upvotes: 1