【问题标题】:Filter unique elements from array using Pipe filter in Angular使用 Angular 中的管道过滤器过滤数组中的唯一元素
【发布时间】:2018-07-09 13:30:20
【问题描述】:

我正在尝试使用 Angular 实现管道。下面是我尝试过的代码。我想检索唯一的完整列表。所以我为内部列表添加了一个管道过滤器名称。但我仍然得到重复的元素。我添加了 json 以供参考。内部的 ArticleTags 数组有一个对象列表。同样,每个父数组都有多个 ArticleTags 数组。我想从整个列表 ArticleTags 数组中检索唯一元素。我认为它检索特定内部列表中的唯一元素,而不是从文章标签的整个列表中检索。

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)
      );
  }

我从articlesListArray 获取主数组数据并将其传递给html


2018 年 7 月 9 日编辑更新

使用以下管道代码获取以下错误。

从“@angular/core”导入 { Pipe, PipeTransform };

@管道({ 名称:“过滤重复” }) 导出类 FilterduplicatesPipe 实现 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);
}

}

【问题讨论】:

  • 所以你循环通过articlesListArray 得到articlesResult,然后在第二个&lt;li&gt; 标签你循环通过articlesResult.ArticleTags 得到unique articlesTagResult,但不是使用articlesTagResult.value,而是使用articlesResult.ArticleTags[j].value
  • 好的,所以我尝试使用 但它仍然检索到重复的元素。我还附上了输出的屏幕截图供您参考。第二个数组是元素列表。背部、伤害、生活方式、肩部属于一个列表。根据我的假设,它正在检索该数组中的唯一元素。但它不能与其他数组元素列表进行比较,或者我不确定。
  • 好的,我现在明白了,你有文章列表,每篇文章都有标签,你想要所有文章的标签联合......对吗?
  • 是的,你完全正确
  • @j4rey89 关于如何从 .t​​s 文件中实现的任何线索。我已粘贴 .ts 代码以供参考。

标签: angular pipe


【解决方案1】:

假设你的文章[]是这样的:

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);
    }
}

上面的管道返回一组包含articletag值的字符串。

<ul>
    <li *ngFor="let a of articles | filterUnique">{{a}}</li>
</ul>

【讨论】:

  • 我在管道文件中使用了代码并收到错误 Cannot read property 'map' of undefined 。您能否从您的答案中删除重复的代码并有一个答案。我看到有很多重复。但是,您在管道文件中提到的代码出现上述错误。
  • 去掉了重复的代码.....至于Cannot read property 'map' of undefinedmapArray的一个属性,确保数据是类型为Array
  • 实际上我正在获取显示的唯一元素列表:),但出现错误消息无法读取未定义的属性“地图”,地图是控制台中数组的属性:(但我仍然接受你的答案。
  • 如果我的回答帮助解决了您的问题,请检查绿色勾号。
  • 我已经完成了。 .但是你知道为什么我得到了这个错误,虽然我得到了正确的唯一列表吗?
【解决方案2】:

参考这里有独特的过滤器 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] -->

【讨论】:

  • 好的,然后尝试使用角度设置来响应服务器的响应,它将仅显示唯一元素
【解决方案3】:

首先导入到模块中

`import { FilterPipe} from 'your-custom-pipe-path';`

那么你应该注入自定义管道

@NgModule({
declarations: [
     FilterPipe
    ]
})

其余代码都很好。 希望这会对你有所帮助。

【讨论】:

  • 我已经完成了所有这些。正如他在评论中提到的那样,j4rey89 很好地理解了我的要求。
  • 你能不能尝试注入你的组件@Component({ pipes: [FilterPipe] })也试试这个。
猜你喜欢
  • 2018-06-16
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多