【问题标题】:Bug When Trying to Sort with Lodash Angular 6尝试使用 Lodash Angular 6 进行排序时出现错误
【发布时间】:2019-09-05 22:04:09
【问题描述】:

我有一个数组需要删除重复记录,然后留下点击次数最多的记录

我需要这个组显示两条记录,一条点击 7 次,另一条点击 3 次。

我已经将一系列冗长的问题缩小到这几行代码(第一个 map 方法),如果这些代码到位,则会在 ngOnInit() 上将一个空对象发送回浏览器。

这是方法:

getCommissions(){
    this.commissions$ = this.analyticsService.getAllCommissionData().pipe(
      map((commissionData: {data: Commission[]}) => {<--problem code
        const commissions = commissionData.data;<--problem code
        return _.uniqBy(commissions.sort((a, b) => b.clicks - a.clicks), commission => commission.page_url);<--problem code
      }), 
      map((commissionData: {data: Commission[]}) => {
        const commissions = commissionData.data;
        return _.groupBy(commissions, commission => commission.page_type)
      }),
      catchError(err => {
        this.errorObject = err;
        console.log(this.errorObject);
        return throwError(err);
      })
    )
  }

也值得分享课程:

export class Commission {
    id: number;
    url: string;
    page_url: string;
    page_type: string;
    clicks: number;
}

和html:

<ng-container *ngIf="commissions$ | async as commissions; else loading">
  <ng-container *ngFor="let page_type of ['home', 'article','statistics', 'products']">
    <h4>{{ page_type | titlecase }}</h4>
    <p *ngIf="!commissions[page_type]">No {{ page_type }} Commissions Logged Yet</p>
    <ul *ngFor="let card of commissions[page_type]">
      <app-click-card [card]="card"></app-click-card>
    </ul>
  </ng-container>
</ng-container>
<ng-container *ngIf="errorObject"> 
  {{ errorObject }}
</ng-container>
<ng-template #loading>
    <h4>Loading ...</h4>
</ng-template>

我有一个stackblitz of an example。但我似乎无法弄清楚为什么第一个地图无法使用 lodash 正确运行 - 数据设置正确并且排序不会出现任何错误,但是排序时(我猜)结果是一个空对象.

有人有什么建议吗?

【问题讨论】:

  • 您能否分享一下使用 stackblitz 中的示例数据进行转换后预期数组的样子?该示例似乎删除了重复项并按正确的属性分组,以及按点击次数降序排序。
  • 当然。我现在就设置。
  • @AlexanderStaroselsky - 你能检查一下这个更新了吗? stackblitz.com/edit/angular-qzeyvg
  • 是的,这个想法是将数组分组为页面类型,然后显示特定 page_url 的最高点击次数。即删除记录的重复项。
  • 您是说每个组中点击率最高的那个吗?

标签: javascript arrays angular sorting lodash


【解决方案1】:

您的问题是您的第一张地图改变了数据的形状,而第二张地图不再接收类型为 { data: Commission[] } 的对象,它接收来自第一张地图的输出,该地图没有数据属性,它已经是一个佣金数组,所以

const commissions = commissionData.data;

未定义。

将您的第二张地图更改为

map((commissions: Commission[]) => {
  return _.groupBy(commissions, commission => commission.page_type);
}),

【讨论】:

  • 绝对是一个有效的点。不过,在 stackblitz 中,他们并没有提取属性数据,因此问题不大。
  • 谢谢。我已经添加了这个,但是数组只显示了最后一组和一条记录。 ://
  • 我有commissionData 排序而不是佣金 - 我已修复,现在可以正确显示。谢谢阿德里安。我花了一天的大部分时间才把它弄好。非常感谢你的帮助!你现在看不到我脸上的宽慰!!!! :D 但它就在那里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 2018-12-05
  • 2015-12-07
  • 2021-03-28
  • 1970-01-01
相关资源
最近更新 更多