You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优先级复选框过滤问题:数组push报错及RxJS filter用法咨询

问题解决与RxJS实现方案

1. 修复push报错问题

报错TypeError: Cannot read properties of undefined (reading 'push')的原因是priorityArr仅做了类型声明,未初始化为数组。

修复代码:

// 直接初始化为空数组
priorityArr: any[] = [];

selectedCheckBoxFilter(prio: any){
  console.log('demo --> ',prio)
  console.log("prioLevel parent ",prio.priorityLevel)

  console.log("priority array -->",this.priorityArr);
  for(let i=0;i<this.data.length;i++){
    if(this.data[i].priority==prio.priorityLevel){
      if(prio.canEnable){
        console.log(this.data[i]);
        this.priorityArr.push(this.data[i])
      }
    }
  }
}

2. 优化过滤逻辑(避免重复添加/未处理取消勾选)

原逻辑仅处理勾选添加,未处理取消移除,且重复勾选会导致数据重复。调整后的逻辑:

priorityArr: any[] = [];

selectedCheckBoxFilter(prio: any) {
  // 筛选当前优先级对应的所有数据项
  const targetItems = this.data.filter(item => item.priority === prio.priorityLevel);
  
  if (prio.canEnable) {
    // 勾选时:添加不在数组中的项,避免重复
    targetItems.forEach(item => {
      if (!this.priorityArr.includes(item)) {
        this.priorityArr.push(item);
      }
    });
  } else {
    // 取消勾选时:移除该优先级的所有项
    this.priorityArr = this.priorityArr.filter(item => item.priority !== prio.priorityLevel);
  }
}

3. RxJS filter操作符实现方案

用RxJS的响应式方式管理选中状态,自动完成过滤:

代码实现

import { BehaviorSubject, combineLatest, map } from 'rxjs';

// 存储已选中的优先级集合(响应式状态)
selectedPriorities$ = new BehaviorSubject<string[]>([]);
// 原始数据转为Observable(若data是动态的,可后续用next更新)
data$ = new BehaviorSubject(this.data);

// 实时生成过滤后的结果Observable
filteredData$ = combineLatest([this.data$, this.selectedPriorities$]).pipe(
  map(([data, selectedPrios]) => {
    // 用RxJS风格的filter过滤数据
    return data.filter(item => selectedPrios.includes(item.priority));
  })
);

// 处理子组件复选框事件
selectedCheckBoxFilter(prio: any) {
  const currentSelected = this.selectedPriorities$.value;
  let updatedSelected: string[];

  if (prio.canEnable) {
    // 勾选:添加优先级,用Set去重
    updatedSelected = [...new Set([...currentSelected, prio.priorityLevel])];
  } else {
    // 取消:移除对应优先级
    updatedSelected = currentSelected.filter(p => p !== prio.priorityLevel);
  }

  // 更新选中状态
  this.selectedPriorities$.next(updatedSelected);
}

模板展示

使用Angular异步管道自动订阅/取消订阅:

<div *ngFor="let item of filteredData$ | async">
  <!-- 渲染数据项内容 -->
</div>

内容的提问来源于stack exchange,提问作者user17282548

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:46:18