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

Angular中匹配列表时忽略名称后缀状态的复选框选中问题

解决方案:匹配带(Inactive)后缀的名称以设置复选框选中状态

问题分析

原代码通过d.id == control.id && d.name == control.name严格匹配id和名称,导致选中列表中带(Inactive)后缀的条目无法与主列表的常规名称匹配——即使二者id完全一致。

实现思路

核心需要满足两个匹配条件:

  • id完全相等
  • 选中项的名称去掉末尾的(Inactive)后缀后,与主列表的名称完全一致

可以通过两种方式实现,兼顾简洁性和可复用性:

修改后的代码

方式1:直接在查找逻辑中处理名称

const formControls = this.arrList.map((control) => {
  if (this.payload) {
    const item = this.selectedArr.find((d) => {
      // 精准移除名称末尾的(Inactive)后缀
      const cleanedSelectedName = d.name.replace(/ \(Inactive\)$/, '');
      return d.id === control.id && cleanedSelectedName === control.name;
    });
    return new FormControl(item !== undefined);
  }
  // 无payload时默认返回未选中状态
  return new FormControl(false);
});

方式2:封装辅助函数复用处理逻辑

// 辅助函数:移除名称末尾的(Inactive)后缀
private getCleanName(name: string): string {
  return name.replace(/ \(Inactive\)$/, '');
}

// 生成表单控件
const formControls = this.arrList.map((control) => {
  if (this.payload) {
    const item = this.selectedArr.find(
      (d) => d.id === control.id && this.getCleanName(d.name) === control.name
    );
    return new FormControl(item !== undefined);
  }
  return new FormControl(false);
});

关键逻辑说明

  • 正则表达式/ \(Inactive\)$/确保只匹配末尾的(Inactive)后缀,避免误处理名称中间包含该字符串的情况
  • 使用===进行全等判断,避免类型转换带来的潜在问题
  • 补充了this.payload不存在时的默认返回逻辑,保证代码完整性

数据匹配验证

针对示例数据:

  • 主列表条目:{"id": "23711086", "name": "Test Propose Concept2 [P]"}
  • 选中列表条目:{"id": "23711086", "name": "Test Propose Concept2 [P] (Inactive)"}

处理后选中项的名称会被清理为"Test Propose Concept2 [P]",与主列表名称完全一致,同时id匹配,因此会判定为匹配,复选框设置为选中状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:55:19