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

JSX中如何根据条件动态添加可选filter过滤逻辑

JSX中基于条件添加可选数组过滤器的正确实现

你原有代码存在两个核心问题:

  • 直接在数组方法调用链中间插入三元表达式,不符合JavaScript语法规则,会直接抛出语法错误
  • String.prototype.includes() 仅支持传入1个待匹配字符串参数,你写的.includes('BACKPACK','LUNCH')实际只会匹配BACKPACK,LUNCH参数会被完全忽略,达不到预期过滤效果

针对你需要按教师权限追加过滤规则的需求,有两种可读性最好的实现方式:


写法1:将条件判断整合到过滤逻辑中(最简洁)

不需要打断方法调用链,在对应filter内部做权限判断,无权限时直接返回true保留所有条目即可:

<Menu>
  {itemGroupLevels.map(group => 
    this.props.itemTypes
      .filter(x => x.group_level === group)
      .filter(x => x.article_type_code !== "GRAL")
      .filter(x => {
        // 非教师角色直接跳过这层过滤
        if (!Permission.TEACHER) return true;
        // 教师角色排除包含指定类型编码的条目
        return !x.article_type_code.includes('BACKPACK') 
          && !x.article_type_code.includes('LUNCH');
      })
      .map(value => (
        // 此处替换为你原有的菜单项渲染逻辑
        <Menu.Item key={value.id}>{value.article_name}</Menu.Item>
      ))
  )}
</Menu>

写法2:拆分过滤步骤(适合复杂规则场景)

如果后续还要追加更多权限相关的过滤规则,建议拆分步骤先拿到基础过滤结果,再按条件追加过滤,代码可维护性更高:

<Menu>
  {itemGroupLevels.map(group => {
    // 先执行所有角色通用的过滤逻辑
    const baseItems = this.props.itemTypes
      .filter(x => x.group_level === group)
      .filter(x => x.article_type_code !== "GRAL");
    
    // 按教师权限追加专属过滤
    const renderItems = Permission.TEACHER
      ? baseItems.filter(x => 
          !x.article_type_code.includes('BACKPACK') 
          && !x.article_type_code.includes('LUNCH')
        )
      : baseItems;

    return renderItems.map(value => (
      <Menu.Item key={value.id}>{value.article_name}</Menu.Item>
    ))
  })}
</Menu>

不推荐为了省代码把三元判断直接写在链式调用的filter参数里,规则复杂后可读性会快速下降,后续维护成本更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 08:39:29